假设你需要某个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实战第四版》