Spring实战中讲解条件化的bean时,所举条件化创建bean的例子:
- 希望一个或多个bean只有在应用的类路径下包含特定的库时创建;
- 希望某个bean只有当另外某个特定的bean也声明之后才会创建;
- 要求某个特定的环境变量设置之后,才会创建某个bean;
设想一种场景:应用部署在多台服务器上,而想应用的其中某个服务只运行在一台服务器上(比如定时任务或者kafka消息监听处理消息等服务),我想条件化的bean可以实现此类需求。比如应用上下文在创建某个bean之前,查询数据库,若数据库配置的此环境ip与当前虚机ip一致,则创建,否则则不创建。
@Bean
@Conditional(IpSameCondition.class) //条件化创建bean注解
public MyTask getMyTask(){
return new MyTask();
}
自定义的条件类IpSameCondition需要实现Condition接口,重写matches()方法即可:
public IpSameCondition implements Condition{
public boolean matches(ConditonContext context,AnnotatedTypeMetadata metadata){
if(ip相等){ return true; }
return false;
}
}