zoukankan      html  css  js  c++  java
  • 条件化的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实战第四版》

  • 相关阅读:
    类加载器
    java类的主动使用方式
    Java类装载器和命名空间
    cas改造
    所有jar文件列出工具
    源码阅读工具_解析所有类的使用情况
    web(s,哈哈,w,没有,d,用处,f)web框架引用类的次数
    struts2类型转换器StrutsTypeConverter的使用
    struts2的验证框架的使用和扩展
    Python3连接MySQL
  • 原文地址:https://www.cnblogs.com/lizijuna/p/11907412.html
Copyright © 2011-2022 走看看