@Conditional及其派生注解
package org.springframework.context.annotation;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Conditional {
Class<? extends Condition>[] value();
}
value: class数组,并且继承Condition
接口
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//获得当前系统名
String property = conditionContext.getEnvironment().getProperty("os.name");
//包含Windows则说明是windows系统,返回true
return property != null && property.contains("Windows");
}
}
public class LinuxCondition implements Condition {
@Override
public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
//获得当前系统名
String property = conditionContext.getEnvironment().getProperty("os.name");
//包含Linux则说明是Linux系统,返回true
return property != null && property.contains("Linux");
}
}
@Configuration
public class BeanConfig{
@Bean("windows)
@Conditional(WindowsCondition.class)
public System widowsSystem(){
return new System("Windows");
}
@Bean("linux")
@Conditional(LinuxCondition.class)
public System liunxSystem(){
return new System("Linux");
}
上述代码中,@Conditional注解作用域在 方法 上,表述在指定操作系统中,windows和linux只有一个bean会被加载。如果是Windows操作系统,则会加载windows bean;如果是Linux操作系统,则会加载linux bean。
@Conditional(WindowsCondition.class)
@Configuration
public class BeanConfig{
@Bean("windows)
public System widowsSystem(){
return new System("Windows");
}
@Bean("linux")
public System liunxSystem(){
return new System("Linux");
}
上述代码中,@Conditional注解作用域在 类 上,表述在Windows操作系统中,windows和linux这两个bean都会被加载;在Linux系统中,windows和linux这两个bean都不会被加载。
@Conditional({WindowsCondition.class,LiunxCondition.class})
@Configuration
public class BeanConfig{
@Bean("windows)
public System widowsSystem(){
return new System("Windows");
}
@Bean("linux")
public System liunxSystem(){
return new System("Linux");
}
上述代码中,@Conditional注解value为WindowsCondition.class,LiunxCondition.class,表述当两个条件全都满足时,类下配置的bean才会被加载(这里一个操作系统不会满足两个条件,所以显然这两个bean都不会被加载)。
其他派生注解
- @ConditionalOnBean: 表述指定bean存在时当前bean才会加载
- @ConditionalOnMissingBean: 表述指定bean不存在时当前bean才会加载
- @ConditionalOnClass: 表述指定类存在时当前bean才会加载
- @ConditionalOnMissingClass: 表述指定类不存在时当前bean才会加载
- @ConditionalOnProperty: 表述指定配置存在时当前bean才会加载
- @ConditionalOnJava: 表述当前java版本为指定范围内时当前bean才会加载