Spring基于@Conditional条件化装配bean

网友投稿 281 2022-12-09


Spring基于@Conditional条件化装配bean

一 前言

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

二 @Conditional 装配bean

思路如下

Spring中提供了@Conditional注解实现条件化是否装配bean,这样可以根据条件动态的装配bean;

要判定@Conditional 注解是否该装配bean还需要Condition 接口配合,我们只须实现 Condition 接口,重写matches 方法;

根据matches方法返回的布尔值进行判定@Conditional是否需要装配bean

实现过程如下

2.1 用户类

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

/**

* @Author lsc

*

*/

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 运行时环境

EnvironmenmmeyHUHt environment = conditionContext.getEnvironment();

// 检查 jvm 运行时环境是否存在属性

return environment.containsProperty("java.runtime.name");

}

}

2.3 用户配置类

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

/**

* @Author lsc

*

*/

@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.getUmmeyHUHserName());

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:Java类成员访问权限控制知识总结
下一篇:如何获得spring上下文的方法总结
相关文章

 发表评论

暂时没有评论,来抢沙发吧~