条件化的Bean

假设你需要某个Bean只有当某个特定的Bean声明了之后或者是只有某个环境变量设置之后才会创建,那么你可以使用下面的方法来实现。

1.需要条件判断之后才创建的Bean

@Bean
@Conditional(Father.class)//调用Father类的matches方法判断,如果结果为true就创建这个
//Bean,否则就不创建;设置给@Conditional的类可以是任何实现了Condition接口的类
public Son getSon() {
    return new Son();
}

2.Father类的matches()方法如下:

public class Father implements 
          org.springframework.context.annotation.Condition{
    @Override//实现了这个接口必须实现的方法
    public boolean matches(ConditionContext arg0, AnnotatedTypeMetadata arg1) 
    {//判断是否存在环境变量OK,属性值无所谓,只要存在就可以,可通过  
    //System.setProperty("OK", "OK");设置该环境变量
        //Environment environment =arg0.getEnvironment();
        //return environment.containsProperty("OK");
        //判断是否存在这个Bean,可通过@Bean("father")设置Bean
        return arg0.getBeanFactory().containsBean("father");
    }
}
public class Son {//Son为一个空类

}

3.测试代码如下:

@Configuration //声明配置文件
@RunWith(SpringJUnit4ClassRunner.class)//使用junit测试
@ContextConfiguration(classes=Main.class) 
public class Main {
    @Autowired//申请自动装配
    public  Father father;
    @Autowired
    public  Son son;

    @Bean("father")//加载该Bean,如果将@Bean("father")注释,会同时导致两个
    //Bean(father和son)的自动装载失败
    public Father getFather() {
        return new Father();
    }
    @Bean//进入Father类的matches()方法判断是否加载该Bean
    @Conditional(Father.class)
    public Son getSon() {
        return new Son();
    }
    @Test
    public  void test() {
        if(father!=null) {
            System.out.println("father is not null!");
        }else {
            System.out.println("father is null!");
        }

        if(son!=null) {
            System.out.println("son is not null!");
        }else {
            System.out.println("son is null!");
        }
    }
}

参考资料:
《Spring实战第四版》

你可能感兴趣的:(条件化的Bean)