@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(); } |
---|