Spring5 条件化的Bean装配之Conditional的使用
Posted 冰点IT
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring5 条件化的Bean装配之Conditional的使用相关的知识,希望对你有一定的参考价值。
什么叫条件化的Bean装配?有时我们需要在满足特定的条件下装配一个Bean,比如spring的profile功能,它可以让Bean组件在指定的环境下创建,那么下面我们使用条件化的Bean装配来简单模拟一下profile的功能。
1、条件化Bean装配
要想实现条件化的Bean装配,得使用Spring的@Conditional注解,@Conditional的value值可以是任何实现了Condition接口的类。
1.1、Condition接口
public interface Condition {
boolean matches(ConditionContextcontext, AnnotatedTypeMetadata metadata);
}
由代码可以看出Condition接口只有一个matches方法,我们可以通过context、和metadata来定义Bean创建的条件,最终返回一个布尔值,如果是true则表示条件验证通过可以装配,否则不可以装配。
1.2、创建一个条件化的Bean
1、准备工作:创建一个简单Java 类Blog
public class Blog {
}
2、创建Condition的实现类
public class BlogBeanConditional implements Condition {
public booleanmatches(ConditionContext context, AnnotatedTypeMetadata metadata) {
Environmentenvironment = context.getEnvironment();
String [] defProfile =environment.getDefaultProfiles();
for(String str :defProfile) {
if(str.equals("test")) {
return true;
}
}
return false;
}
}
这里主要判断了“test”这个环境属性是否存在,如果存在则返回true,否则返回false。
3、创建配置类
public class BeanConfig {
(BlogBeanConditional.class)
public Blog getBlog() {
return new Blog();
}
}
暂时先不声明User为一个Bean。
4、编写测试类
public class TestBeanConfig {
private static AnnotationConfigApplicationContext afac =
new AnnotationConfigApplicationContext();
private static Loggerlogger = LoggerFactory.getLogger(TestBeanConfig.class);
public voidtestDataSourceConfig() throws SQLException {
ConfigurableEnvironment environment = afac.getEnvironment();
environment.setDefaultProfiles("test");
afac.register(BeanConfig.class);
afac.refresh();
if(afac.containsBean("getBlog")) {
logger.info("getBlog bean 已创建成功");
} else {
logger.info("getBlog bean 没有被创建");
}
}
}
运行结果:
19:49:41,929 DEBUG main support.DefaultListableBeanFactory:213 -Creating shared instance of singleton bean 'beanConfig'
19:49:41,940 DEBUG main support.DefaultListableBeanFactory:213 -Creating shared instance of singleton bean 'getBlog'
Disconnected from the target VM, address: '127.0.0.1:51054',transport: 'socket'
19:49:42,003 INFO mainservice.TestBeanConfig:34 - getBlog bean 已创建成功
5、修改测试类
//environment.setDefaultProfiles("test");
将设置默认环境属性的代码注释掉。
运行结果:
19:52:06,377 DEBUG main support.DefaultListableBeanFactory:213 -Creating shared instance of singleton bean'org.springframework.context.annotation.internalCommonAnnotationProcessor'
19:52:06,387 DEBUG main support.DefaultListableBeanFactory:213 -Creating shared instance of singleton bean 'beanConfig'
Disconnected from the target VM, address: '127.0.0.1:51133',transport: 'socket'
19:52:06,448 INFO mainservice.TestBeanConfig:36 - getBlog bean 没有被创建
以上测试结果表明,我们可以通过设置一些Bean的装配条件灵活的创建Bean,从而解决在复杂业务中Bean的创建时机问题,这就是所谓的条件化的Bean装配。
关注我
冰点IT,探索最新开发技术,记录追求梦想的点点滴滴!
长按二维码,或点击最上方蓝色的 冰点IT 关注我,您的关注是对我最好的鼓励!
以上是关于Spring5 条件化的Bean装配之Conditional的使用的主要内容,如果未能解决你的问题,请参考以下文章