SpringBoot这些条件注解助你高效开发
1. 简介
Spring Boot 包含大量 @Conditional 注解,你可以通过注解 @Configuration 类或单个 @Bean 方法在自己的代码中重复使用这些注解。这些注解包括:
-
Class Conditions
在类上添加的条件注解。
-
Bean Conditions
在方法上使用@Bean注解时使用注解。
-
Property Conditions
根据属性配置判断条件注解。
-
Resource Conditions
根据资源判断条件注解
-
Web Application Conditions
针对web环境的注解
-
SpEL Expression Conditions
可以使用SpEL表达式的注解
2. Class Conditions
@ConditionalOnClass 和 @ConditionalOnMissingClass 注解使 @Configuration 类可以根据特定类的存在或不存在而被包含。如下例所示:
@Configuration(proxyBeanMethods = false)@ConditionalOnClass(CustomLogImpl.class)public class PackConfiguration {
@Bean public LogAspect logAspect() { // ...
}}
如果使用 @ConditionalOnClass 或 @ConditionalOnMissingClass 作为元注解的一部分来编写自己的组成注解,则必须使用 name,因为在这种情况下对类的引用不会被处理。
3. Bean Conditions
@ConditionalOnBean 和 @ConditionalOnMissingBean 注解允许根据特定 Bean 的存在或不存在来包含 Bean。你可以使用 value 属性按类型指定 Bean,也可以使用 name 属性按名称指定 Bean。搜索属性可让你限制在搜索 Bean 时应考虑的 ApplicationContext 层次结构。
@Configurationpublic class PackConfiguration {
// 指定只能在当前容器中查找,如果存在父容器不会在父容器中查找
// 这里的默认值是ALL
@Bean
@ConditionalOnMissingBean(search = SearchStrategy.CURRENT)
public UserService userService() {
return new UserService ();
}
}
你需要非常注意添加 Bean 定义的顺序,因为这些条件是根据目前已处理的内容进行评估的。
注意:****@ConditionalOnBean 和 @ConditionalOnMissingBean 不会阻止 @Configuration 类的创建。在类级别使用这些条件与使用注解标记每个包含的 @Bean 方法之间的唯一区别是,如果条件不匹配,前者会阻止将 @Configuration 类注册为 Bean。
4. Property Conditions
@ConditionalOnProperty 注解允许根据 Spring 环境属性进行配置。使用前缀和名称属性指定应检查的属性。默认情况下,任何存在且不等于 false 的属性都会被匹配。你还可以使用 havingValue 和 matchIfMissing 属性创建更高级的检查。
@Configurationpublic
class PropertyCondition {
@Bean
@ConditionalOnProperty(prefix = "pack.config", name = "enabled", havingValue = "true", matchIfMissing = true)
public AnimalService animalService() {
return new AnimalService() ;
}
}
当配置文件中的pack.config.enabled=true或者没有配置时,条件都成立。
5. Resource Conditions
@ConditionalOnResource 注解允许配置仅在特定资源存在时才被包含。资源可通过使用通常的 Spring 约定来指定,如下例所示:
@Configurationpublic
class PropertyCondition {
@Bean
@ConditionalOnResource(resources = {"classpath:config.properties"})
public AnimalService animalService() {
return new AnimalService() ;
}
}
当类路径下存在config.properties文件时才会创建上面的AnimalService。
6. Web Application Conditions
通过 @ConditionalOnWebApplication 和 @ConditionalOnNotWebApplication 注解,可以根据应用程序是否是 Web 应用程序来进行配置。基于 servlet 的 Web 应用程序是指使用 Spring WebApplicationContext、定义会话作用域或具有 ConfigurableWebEnvironment 的任何应用程序。反应式网络应用是指使用 ReactiveWebApplicationContext 或具有 ConfigurableReactiveWebEnvironment 的任何应用。
通过 @ConditionalOnWarDeployment 和 @ConditionalOnNotWarDeployment 注解,可以根据应用程序是否是部署到 servlet 容器的传统 WAR 应用程序来进行配置。对于使用嵌入式 Web 服务器运行的应用程序,此条件将不匹配。
@Configurationpublic class PropertyCondition { @Bean @ConditionalOnWebApplication(type = Type.REACTIVE) public AnimalService animalService() { return new AnimalService() ; }}
只有当前环境是基于反应式的才会创建Bean,反应式的条件是项目中引入的是webflux(不能同时存在web,否则以servlet为主)。
7. SpEL Expression Conditions
@ConditionalOnExpression注解允许根据 SpEL 表达式的结果加入配置。
@Configurationpublic
class PropertyCondition {
@Bean
@ConditionalOnExpression("#{'true'.equals('${pack.config.enabled}')}")
public AnimalService animalService() {
return new AnimalService() ;
}
8. 自定义Condition
自定义条件匹配类
public class PackConditionProperty implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Boolean result = context.getEnvironment().getProperty("pack.config.enabled", Boolean.class, true) ;
return result ;
}
}
自定义注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.TYPE})
@Conditional({PackConditionProperty.class})
public @interface PackCondition {}
通过@Conditional注解添加上面的条件类。
以上是本篇文章的全部内容,希望对你有帮助。
原文地址:https://blog.csdn.net/itguangit/article/details/142526428
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!