一 .概述
在spring之中提供@Conditional注解完成条件注入.
我们可以实现特定的接口,完成配置类可以根据条件进行Bean的创建.
二 .测试
public abstract class OS {
protected String name;
public String getName() {
return this.name;
}
}
class Windows extends OS {
public Windows() {
super.name = "windows";
}
}
class Linux extends OS {
public Linux() {
super.name = "linux";
}
}
配置类:
@Configuration
public class ConditionalConfig {
@Bean//只用条件成立才会创建对象
@Conditional(WindowsConditonal.class)
public OS windows() {
return new Windows();
}
@Bean
@Conditional(LinuxConditional.class)
public OS linux() {
return new Linux();
}
}
两个条件类:
public class AbstractConditional {
public String getOSName(ConditionContext context) {
Environment environment = context.getEnvironment();
String osName = environment.getProperty("os.name");
return osName;
}
}
public class WindowsConditonal extends AbstractConditional implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
if(super.getOSName(context).toUpperCase().contains("WINDOWS")) {
return true;
}
return false;
}
}
public class LinuxConditional extends AbstractConditional implements Condition{
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
if(super.getOSName(context).toUpperCase().contains("LINUX")) {
return true;
}
return false;
}
}
只有当当前的操作系统为windows时,才会注入该bean.
测试:
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes= {ConditionalConfig.class})
public class ConditionalTest {
@Autowired
private ApplicationContext context;
@Test
public void test() {
System.out.println(context.getBean(OS.class).getName());
}
}
结果返回为window,说明在当前的操作系统中只能创建一个Bean,另外一个Bean的声明并不会执行,否则getBean()方法会出现问题.
三 . 总结
[1] 如果我们想要按照一定的条件注册Bean,我们就可以使用@Conditional注解.
[2]在使用@Conditional注解的时候,我们需要指明一个Condition接口的子类.
[3]spring会按照Condition的实现类完成是否创建该Bean.
[4]在本节之中,我们使用了一个环境属性的概念,这个概念在后面我们会重点说明.