转载

spring之@Conditional条件化装配bean

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

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

二 @Conditional 装配bean

思路如下

@Conditional
@Conditional
@Conditional

实现过程如下

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());
    }
}
复制代码

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

原文  https://juejin.im/post/5e970169518825738b421d75
正文到此结束
Loading...