了解过springBoot自动配置原理的同学,应该知道@Conditional注解在底层应用很广
总结:
**@Conditional({Condition}) :
1.按照一定的条件进行判断,满足条件给容器中注册bean
2.implements Condition
3.注解都可以加在方法上或者类上,相应的生效影响范围自然是 改方法的组件或者该类的组件
**
public class MainConfig2020 {
@Bean("bill")
public Person person01(){
return new Person("Bill Gates",62);
}
@Bean("linus")
public Person person02(){
return new Person("linus", 48);
}
}
@Test
public void test03(){
AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext(MainConfig2020.class);
String[] namesForType = applicationContext.getBeanNamesForType(Person.class);
Map<String, Person> persons = applicationContext.getBeansOfType(Person.class);
System.out.println(persons);
}
测试 首先两个bean都是在IOC容器中的,
{bill=Person [name=Bill Gates, age=62, nickName=null], linus=Person [name=linus, age=48, nickName=null]}
我们想到linux系统时才注册linus,改怎么做呢 @Conditional(LinuxCondition.class)
public class MainConfig2020 {
@Bean("bill")
public Person person01(){
return new Person("Bill Gates",62);
}
@Conditional(LinuxCondition.class)
@Bean("linus")
public Person person02(){
return new Person("linus", 48);
}
}
//判断是否linux系统
public class LinuxCondition implements Condition {
/**
* ConditionContext:判断条件能使用的上下文(环境)
* AnnotatedTypeMetadata:注释信息
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
// TODO是否linux系统
//1、能获取到ioc使用的beanfactory,就是创建对象以及装配的工厂
ConfigurableListableBeanFactory beanFactory = context.getBeanFactory();
//2、获取类加载器
ClassLoader classLoader = context.getClassLoader();
//3、获取当前环境信息
Environment environment = context.getEnvironment();
//4、获取到bean定义的注册类,可以在此查有没有那个bean的定义
BeanDefinitionRegistry registry = context.getRegistry();
String property = environment.getProperty("os.name");
//可以判断容器中的bean注册情况,也可以给容器中注册bean
boolean definition = registry.containsBeanDefinition("person");
if(property.contains("linux")){
return true;
}
return false;
}
}
测试结果在Windows 情况下只会注册Bill bean
Windows 8.1
bill
{bill=Person [name=Bill Gates, age=62, nickName=null]}
当切换linux环境时,两个都会被加载注册
linux
bill
linus
{bill=Person [name=Bill Gates, age=62, nickName=null], linus=Person [name=linus, age=48, nickName=null]}