Spring基于@Conditional条件化装配bean
一前言
理解spring的如何根据条件装配bean有助于我们更好使用springboot进行开发,和源码理解;
二@Conditional装配bean
思路如下
Spring中提供了@Conditional注解实现条件化是否装配bean,这样可以根据条件动态的装配bean;
要判定@Conditional注解是否该装配bean还需要Condition接口配合,我们只须实现Condition接口,重写matches方法;
根据matches方法返回的布尔值进行判定@Conditional是否需要装配bean
实现过程如下
2.1用户类
用户类用于配置类是否装配该Bean
/**
*@Authorlsc
*
*/
publicclassUser{
privateStringuserName;
//省略setget
}
2.2Condition实现类
RuntimeExist实现Condition,使用conditionContext获取jvm环境变量,如果存在则返回true,否则返回false;其中conditionContext还有如下方法
- getRegistry():使用BeanDefinitionRegistry的检查bean定义;
- getBeanFactory():使用ConfigurableListableBeanFactory检查bean是否存在;
- getEnvironment():Environment环境变量
- getResourceLoader():ResourceLoader加载的资源;
- getClassLoader():ClassLoader加载的类。
publicclassRuntimeExistimplementsCondition{
publicbooleanmatches(ConditionContextconditionContext,AnnotatedTypeMetadataannotatedTypeMetadata){
//获取jvm运行时环境
Environmentenvironment=conditionContext.getEnvironment();
//检查jvm运行时环境是否存在属性
returnenvironment.containsProperty("java.runtime.name");
}
}
2.3用户配置类
根据RuntimeExist的matches方法的返回值是否装配bean;这边设置了属性名称zszxz,以便于更好的测试;
/**
*@Authorlsc
*
*/
@Configuration
publicclassUserConfig{
@Bean
//根据RuntimeExist的matches方法的返回值是否装配bean
@Conditional(RuntimeExist.class)
publicUseruser(){
Useruser=newUser();
user.setUserName("zszxz");
returnuser;
}
}
2.4测试
由于jvm运行时环境存在java.runtime.name属性,故会装配成功,会打印出zszxz;
如果将java.runtime.name改为任意jvm运行时不存在的属性,测试就会报异常;
@RunWith(SpringJUnit4ClassRunner.class)//创建spring应用上下文
@ContextConfiguration(classes=UserConfig.class)//加载配置类
publicclassConditionTest{
@Autowired
Useruser;
@Test
publicvoidtest(){
//zszxz
System.out.println(user.getUserName());
}
}
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。