@Conditional


使用场景是根据条件判断来考虑是否加载bean,SpringBoot的底层大量应用了@Conditional注解.

案例:ZJJ_Spring2019/10/12_10:11:38_utb4y


我们的 Bean 可能只想在某些特定的环境下被创建,比如说我们只想在生产环境下创建一个特殊的 Bean。
在 Spring 4 之后引入了 @Conditional 注解

| @Bean
@Conditional(ProdExistsCondition.class)
public ProdBean prodBean(){
return new ProdBean();
} | | —- |


设置给 @Conditional 的类可以是任意实现了 Condition 接口的类型。可以看出来,这个接口实现起来很简单直接,只需提供 matches() 方法的实现即可。如果 matches() 方法返回 true,那么就会创建带有 @Conditional 注解的 bean。如果 matches() 方法返回 false,将不会创建这些 bean。

| public class ProdExistsCondition implements Condition {
public boolean matches(ConditionContext ctx, AnnotatedTypeMetadata metadata) {
Environment env = ctx.getEnvironment();
return env.containsProperty(“prod”);
}
} | | —- |





@ConditionalOnBean:当SpringIoc容器内存在指定Bean的条件
@ConditionalOnClass:当SpringIoc容器内存在指定Class的条件
@ConditionalOnExpression:基于SpEL表达式作为判断条件
@ConditionalOnJava:基于JVM版本作为判断条件
@ConditionalOnMissingBean:当SpringIoc容器内不存在指定Bean的条件
@ConditionalOnMissingClass:当SpringIoc容器内不存在指定Class的条件
@ConditionalOnNotWebApplication:当前项目不是Web项目的条件
@ConditionalOnProperty:指定的属性是否有指定的值
@ConditionalOnResource:类路径是否有指定的值
@ConditionalOnSingleCandidate:当指定Bean在SpringIoc容器内只有一个,或者虽然有多个但是指定首选的Bean
@ConditionalOnWebApplication:当前项目是Web项目的条件

1.ConditionalOnExpression


类上面注解

| @ConditionalOnExpression(“‘${flag}’.equals(‘memory’)“_)
_public class
TulingAuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { | | —- |

yml

flag: memory



这个注解可以作用与类也可以作用于@Bean注解的方法上面,符合条件了就实例化

其它用法:

@ConditionalOnExpression(“${mq.cumsumer.enabled}==1&&${rabbitmq.comsumer.enabled:true}”)
@ConditionalOnExpression(“‘${mq.comsumer}’.equals(‘rabbitmq’)”)



2.ConditionalOnProperty

/
检查yml的 spring.profiles.active 如果是dev就实例化这个bean,否则就不实例化
/
@Bean
@ConditionalOnProperty(prefix = “spring”, name = “profiles.active”, havingValue = “dev”)
public ServerEndpointExporter serverEndpointExporter() {
log.info(“开启了websocket配置…………….”);
return new** ServerEndpointExporter();
}