@Conditional是Spring4新提供的注解,它的作用是按照一定的条件进行判断,满足条件给容器注册bean。
codition是通过判断条件若成立则注册bean否则不注册
public interface Condition {
/**
* 条件判断 true为匹配,false为不匹配
*/
boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata);
}
org.springframework
spring-context
4.3.11.RELEASE
/**
* @Auther: csh
* @Date: 2020/7/10 17:07
* @Description:条件用户7
*/
public class ConditionUser7 implements Serializable {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public ConditionUser7() {
}
public ConditionUser7(String name) {
this.name = name;
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 17:28
* @Description:
*/
@Component
public class SystemCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environment environment = context.getEnvironment();
String env_system = environment.getProperty("env_system");
System.out.println("获取系统变量:"+env_system);
if(env_system.equalsIgnoreCase("windows")){
return true;
}
return false;
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 17:27
* @Description:
*/
@Configuration
public class ConfigSystem {
@Conditional({SystemCondition.class})
@Bean(name = "conditionUser7")
public ConditionUser7 getSystemInfo(){
return new ConditionUser7("hong2");
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 17:38
* @Description:测试@Conditional
*/
public class ConditionalTest {
public static void main(String[] args) {
//从类路径的xm文件载入上下文定义的信息
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(ConfigSystem.class);
String env_system = context.getEnvironment().getProperty("env_system");
System.out.println("系统为:"+env_system);
Map beansOfType = context.getBeansOfType(ConditionUser7.class);
System.out.println(JSONObject.toJSONString((beansOfType)));
}
}
-Denv_system=windows
获取系统变量:windows
系统为:windows
{"conditionUser7":{"name":"hong2"}}
-Denv_system=linux
获取系统变量:linux
系统为:linux
{}
1.是在执行AnnotationConfigApplicationContext#reflsh方法,调用invokeBeanFactoryPostProcessors,执行 BeanFactoryPostProcessorr的postProcessBeanDefinitionRegistry 方法
2.会加载bean的定义信息
3.会执行ConditionEvaluator#shouldSkip判断这个类是否应该被跳过
然后就会调用我们自定义的ColorCondition#matches方法
如果返回false,则不会注册对应bean到ioc容器中
@condition这个注释非常好理解也就是条件的意思,当然本版本是4.x的如果是5.x以后可能稍有不一样,不过大致相同,该注解其实就是通过一些条件来判断是否注入到bean中,的确是一个非常不错的注解,在一些业务场景下或加载某些配置。更多请查看源码,谢谢。
【Spring源码分析】42-@Conditional详解