欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 游戏 > Spring Boot中的条件注解是如何工作的

Spring Boot中的条件注解是如何工作的

2025/1/19 7:59:07 来源:https://blog.csdn.net/hekai7217/article/details/145200474  浏览:    关键词:Spring Boot中的条件注解是如何工作的

MyBean在Spring Boot中,条件注解(如@Conditional)使得某些bean的创建与否可以依赖于应用程序的特定条件。这些条件通常是基于环境配置、系统属性、类的存在与否等。

常见的条件注解

  1. @Conditional - 基本的条件注解,用来根据条件决定是否注册某个bean。
  2. @ConditionalOnProperty - 基于配置属性的条件。
  3. @ConditionalOnClass - 基于类的存在与否的条件。
  4. @ConditionalOnMissingBean - 判断缺少某个bean时注册。
  5. @ConditionalOnBean - 判断已经存在某个bean时注册。

接下来,我们将通过几个示例来详细了解这些条件注解的使用方式。

1. 使用 @Conditional 注解

@Conditional 是一个基础注解,可以根据自定义条件来决定是否加载某个bean。我们可以通过实现 Condition 接口来定义条件。

示例:根据系统属性来决定bean的注册
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Conditional;
import org.springframework.context.annotation.Configuration;public class MyCondition implements org.springframework.context.annotation.Condition {@Overridepublic boolean matches(org.springframework.context.annotation.ConditionContext context, org.springframework.core.type.AnnotatedTypeMetadata metadata) {// 根据系统属性来决定是否满足条件String property = System.getProperty("myapp.enabled");return "true".equalsIgnoreCase(property);}
}@Configuration
public class MyConfiguration {@Bean@Conditional(MyCondition.class)  // 根据自定义条件来决定是否创建此beanpublic MyService myService() {return new MyService();}
}

在这个例子中,MyService 只有在系统属性 myapp.enabled 的值为 "true" 时才会被注册。

启动时设置系统属性
java -D myapp.enabled=true -jar xxx.jar

2. 使用 @ConditionalOnProperty 注解

@ConditionalOnProperty 是 Spring Boot 提供的一个条件注解,用于基于某个配置属性是否存在或是否满足某个值来决定是否注册bean。

示例:根据配置文件中的属性来决定bean的注册

假设你的 application.properties 文件中有如下配置:

myapp.enabled=true

然后你可以在代码中这样使用 @ConditionalOnProperty

import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyConfiguration {@Bean@ConditionalOnProperty(name = "myapp.enabled", havingValue = "true")public MyService myService() {return new MyService();}
}

只有当配置属性 myapp.enabled的值为 “true” 时,MyService` 才会被注册。

3. 使用 @ConditionalOnClass 注解

@ConditionalOnClass 用于检查某个类是否在类路径上,如果在,则注册相关的bean。这个注解常用于某些库的自动配置。

示例:根据类是否存在来决定bean的注册
import org.springframework.boot.autoconfigure.condition.ConditionalOnClass;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyConfiguration {@Bean@ConditionalOnClass(name = "com.hk.MyBean")  // 如果 MyBean 类在类路径中,则创建该beanpublic MyService myService() {return new MyService();}
}

如果 MyBean 类存在于类路径中,则 MyService 会被创建,否则不会。

4. 使用 @ConditionalOnMissingBean 注解

@ConditionalOnMissingBean 注解用于当容器中没有指定类型的bean时,才会注册该bean。这对于提供自动配置非常有用。

示例:如果没有已定义的 MyService bean,则创建一个
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyConfiguration {@Bean@ConditionalOnMissingBean(MyService.class)  // 如果容器中没有 MyService 类型的bean,则创建此beanpublic MyService myService() {return new MyService();}
}

5. 使用 @ConditionalOnBean 注解

@ConditionalOnBean 注解用于当容器中已存在某个类型的bean时,才会注册当前的bean。

示例:当 AnotherService 已经存在时创建 MyService
import org.springframework.boot.autoconfigure.condition.ConditionalOnBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MyConfiguration {@Bean@ConditionalOnBean(AnotherService.class)  // 只有当 AnotherService 存在时,才会创建 MyServicepublic MyService myService() {return new MyService();}
}

总结

  • @Conditional 是最基础的条件注解,可以自定义条件。
  • @ConditionalOnProperty@ConditionalOnClass 等注解用于基于属性、类等条件来控制bean的注册。
  • @ConditionalOnMissingBean@ConditionalOnBean 用于基于是否已存在某个bean来控制当前bean的注册。

这些条件注解使得Spring Boot能够根据不同的环境或配置灵活地加载bean,从而实现更加模块化和可配置的应用架构。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com