@Conditional
按照一定的条件向Spring的IOC容器中注册,不满足条件就不向容器中注册Bean。@Conditional注解接受一个实现org.springframework.context.annotation.Condition的数组
定义两个Person,一个Bill,一个Linus,分别加上@Conditional注解,然后加上各自的condition
//告诉Spring这是一个配置文件
@Configuration
public class SpringConfig4 {
@Conditional({WindowsCondition.class})
@Bean(name = "bill")//给容器中注册一个bean
public Person getPerson01() {
return new Person("bill", 62);
}
@Conditional({LinuxCondition.class})
@Bean(name = "linus")//给容器中注册一个bean
public Person getPerson02() {
return new Person("linus", 89);
}
}
分别实现WindowsCondition和LinuxCondition。判断条件很简单,判断当前系统的 “os” 属性是LINUX还是WINDOWS
public class WindowsCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String systemName = context.getEnvironment().getProperty("os").toUpperCase();
if (systemName.contains("WINDOWS"))
return true;
return false;
}
}
public class LinuxCondition implements Condition {
/**
* @param context 判断上下文使用的环境
* @param metadata 注释信息
* @return
*/
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
String systemName = context.getEnvironment().getProperty("os").toUpperCase();
if (systemName.contains("LINUX"))
return true;
return false;
}
}
从Spring的IOC容器中获取Person实例
@Test
public void testAnnotation5() {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig4.class);
String os = context.getEnvironment().getProperty("os");
System.out.println("当前系统---->" + os);
Map<String, Person> map = context.getBeansOfType(Person.class);
map.keySet().forEach(key -> {
Person person = map.get(key);
System.out.println(key + "-->" + person.toString());
});
}
随着我们切换系统的 “os” 的属性,我们就能发现注册到Spring的IOC容器中额Person实例也会不一样。当我们把系统的 "os" 修改成windows的时候,Person的实例为:bill,当我们把 "os" 修改成 linux 后,Person实例就变成了:linus
"os" 等于 "windows"
当前系统---->windows
bill-->Person{name='bill', age=62}
"os" 等于 "linux"
当前系统---->linux
linus-->Person{name='linus', age=89}
@Conditionanl注解不仅可以添加在方法上,还可以添加到被@Configuration注解的类上,意思就是满足@Conditional中的Condition的条件,当前配置文件中定义的Bean才会被实例化到Spring的IOC容器中去