Spring5 条件化的Bean装配之Conditional的使用

Posted 冰点IT

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring5 条件化的Bean装配之Conditional的使用相关的知识,希望对你有一定的参考价值。

什么叫条件化的Bean装配?有时我们需要在满足特定的条件下装配一个Bean,比如springprofile功能,它可以让Bean组件在指定的环境下创建,那么下面我们使用条件化的Bean装配来简单模拟一下profile的功能。

1、条件化Bean装配

要想实现条件化的Bean装配,得使用Spring@Conditional注解,@Conditionalvalue值可以是任何实现了Condition接口的类。

1.1、Condition接口

@FunctionalInterfacepublic 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 { @Override 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、创建配置类

@Configurationpublic class BeanConfig { @Bean @Conditional(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); @Test 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的使用的主要内容,如果未能解决你的问题,请参考以下文章

Java Spring5之IOC容器

Spring高级装配 条件化的bean

Spring5 自动化装配Bean

Spring5 Java代码装配Bean

Spring5 XML装配Bean

Spring5Bean 的自动装配及注解开发