在spring4中引入了基于条件创建Bean的注解@Coditional,@Conditional根据满足特定的条件创建一个特定的Bean。比如,当Spring容器中存在某个Bean时,我才创建当前的Bean等等…你可以根据自己的需要来加载Bean,利用这一特性你可以完成自动配置,springboot的自动配置就是根据条件注解@Conditional来实现的,下面我们来看一下如何来使用@Conditional做条件注解
1、我们先定义两个类、一个接口,然后两个接口实现类
public class ProdConfig {
}
public class TestConfig {
}
public interface ConfigBean {
public void syaHello();
}
public class ProdConfigBean implements ConfigBean{
@Override
public void syaHello() {
System.out.println("prod config");
}
}
public class TestConfigBean implements ConfigBean {
@Override
public void syaHello() {
System.out.println("test config");
}
}
2、定义两个类,实现Condition接口
public class ProdConfigCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getBeanFactory().containsBean("prodConfig");
}
}
public class TestConfigCondition implements Condition {
@Override
public boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {
return context.getBeanFactory().containsBean("testConfig");
}
}
3、配置类
@Configuration
public class ProfileConfig {
@Bean(name = "prodConfig")
@Profile("prod")
public ProdConfig javaConfig(){
return new ProdConfig();
}
@Bean(name = "testConfig")
@Profile("test")
public TestConfig xmlConfig(){
return new TestConfig();
}
}
@Configuration
public class ConditionConfig {
@Bean(name = "prodConfigTest")
@Conditional(ProdConfigCondition.class)
public ProdConfigBean prodConfigTest(){
return new ProdConfigBean();
}
@Bean(name = "testConfigTest")
@Conditional(TestConfigCondition.class)
public TestConfigBean testConfigTest(){
return new TestConfigBean();
}
}
4、main方法验证
public class Main {
public static void main(String[] args){
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.getEnvironment().setActiveProfiles("test");
context.register(ProfileConfig.class);
context.register(ConditionConfig.class);
context.refresh();
ConfigBean configTest = context.getBean(ConfigBean.class);
configTest.syaHello();
context.close();
}
}
--------------------以下为输出--------------------
test config
从输出结果中可以看到,条件注解@Conditional根据profile的设置不同,来进行加载不同的Bean