zoukankan      html  css  js  c++  java
  • spring之@Conditional条件化装配bean

    一 前言

    理解spring的如何根据条件装配bean有助于我们更好使用springboot进行开发,和源码理解;

    知识追寻者(Inheriting the spirit of open source, Spreading technology knowledge;)

    二 @Conditional 装配bean

    思路如下

    1. Spring中提供了@Conditional注解实现条件化是否装配bean,这样可以根据条件动态的装配bean;
    2. 要判定@Conditional 注解是否该装配bean还需要Condition 接口配合,我们只须实现 Condition 接口,重写matches 方法;
    3. 根据matches方法返回的布尔值进行判定@Conditional是否需要装配bean

    实现过程如下

    2.1 用户类

    用户类用于配置类是否装配该Bean

    /**
     * @Author lsc
     * <p> </p>
     */
    public class User {
    
        private String userName;
    
    	// 省略 set get
    }
    

    2.2 Condition实现类

    RuntimeExist 实现 Condition ,使用 conditionContext 获取jvm 环境变量,如果存在则返回 true ,否则返回false;其中conditionContext还有如下方法

    • getRegistry():使用BeanDefinitionRegistry的检查bean定义;
    • getBeanFactory():使用ConfigurableListableBeanFactory检查bean是否存在;
    • getEnvironment():Environment环境变量
    • getResourceLoader():ResourceLoader加载的资源;
    • getClassLoader():ClassLoader加载的类。
    public class RuntimeExist  implements Condition {
        public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
            // 获取jvm 运行时环境
            Environment environment = conditionContext.getEnvironment();
            // 检查 jvm 运行时环境是否存在属性
            return environment.containsProperty("java.runtime.name");
        }
    }
    

    2.3 用户配置类

    根据 RuntimeExist的 matches 方法的返回值 是否装配bean; 这边设置了属性名称 zszxz,以便于更好的测试;

    /**
     * @Author lsc
     * <p> </p>
     */
    @Configuration
    public class UserConfig {
    
        @Bean
        // 根据 RuntimeExist的 matches 方法的返回值 是否装配bean
        @Conditional(RuntimeExist.class)
        public User user(){
            User user = new User();
            user.setUserName("zszxz");
            return user;
        }
    }
    

    2.4 测试

    由于 jvm 运行时环境存在 java.runtime.name 属性 ,故会装配成功,会打印出 zszxz ;

    如果将 java.runtime.name 改为 任意jvm 运行时不存在的属性 ,测试就会报异常;

    @RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
    @ContextConfiguration(classes= UserConfig.class)//加载配置类
    public class ConditionTest {
    
        @Autowired
        User user;
    
        @Test
        public void test(){
            // zszxz
            System.out.println(user.getUserName());
        }
    }
    

    源码地址:公众号汇总文章处

  • 相关阅读:
    Safari-IoS调试
    前端加密技术
    gulp入门
    xss攻击
    xml 解析
    python 基本语法
    python初识
    字节
    神奇的算式
    linux-虚拟机安装
  • 原文地址:https://www.cnblogs.com/zszxz/p/12693645.html
Copyright © 2011-2022 走看看