Spring @Conditional注解原理解析

 更新时间:2019年11月20日 14:27:00   作者:闻窗  
这篇文章主要介绍了Spring @Conditional注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

这篇文章主要介绍了Spring @Conditional注解原理解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

@Conditional是Spring4新提供的注解,它的作用是根据某个条件加载特定的bean。

我们需要创建实现类来实现Condition接口,这是Condition的源码

public interface Condition {
  boolean matches(ConditionContext var1, AnnotatedTypeMetadata var2);
}

所以我们需要重写matches方法,该方法返回boolean类型。

首先我们准备根据不同的操作系统环境进行对容器加载不同的bean,先创建Person

public class Person {
}

创建实现类LinuxCondition和WindowCondiction,

LinuxCondition:

public class WindowCondiction implements Condition {
  @Override
  public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {
   return true;
  }
}

WindowCondiction:

public class LinuxCondition implements Condition {
  @Override
  public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) {

    return true;
  }
}

配置类:给相应的bean加上 @Conditional注解,里面的括号将返回boolean类型,返回true则加载bean

@Configuration
public class MainConfig {

  @Profile("window")
  @Conditional(WindowCondiction.class)
  @Bean
  public Person person01(){
    return new Person("李思",30);
  }

  @Profile("linux")
  @Conditional(LinuxCondition.class)
  @Bean
  public Person person02(){
    return new Person("wangwu",35);
  }
}

测试:现在是按照linux环境,@Profile注解先匹配linux的bean,再根据@Conditional 返回的类型判断是否加载bean,这里都设置返回true,所以应该打印

Person{name='wangwu', age=35}

public class CondictionTest {

  @Test
  public void test(){
    //创建容器
    AnnotationConfigApplicationContext applicationContext = new AnnotationConfigApplicationContext();
    //设置需要激活的环境
    applicationContext.getEnvironment().setActiveProfiles("linux");
    //设置主配置类
    applicationContext.register(MainProfileConfig.class);
    //启动刷新容器
    applicationContext.refresh();

    String[] beanNamesForType = applicationContext.getBeanNamesForType(DataSource.class);
    for (String name : beanNamesForType){
      System.out.println(name);
    }
    applicationContext.close();
  }
}

如果把LinuxCondition的返回值该为false,会报找不到bean的异常

org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type 'com.springbean.Person' available

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 使用Java编写导出不确定行数列数数据的工具类

    使用Java编写导出不确定行数列数数据的工具类

    这篇文章主要为大家详细介绍了如何使用Java编写导出不确定行数列数数据的工具类,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-03-03
  • Spring Boot2.6.0新特性之默认禁止循环引用

    Spring Boot2.6.0新特性之默认禁止循环引用

    Spring Boot2.6.0为我们带来很多好用的新特性/改进,这篇文章主要给大家介绍了关于Spring Boot2.6.0新特性之默认禁止循环引用的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-02-02
  • Java微信公众平台开发(8) 多媒体消息回复

    Java微信公众平台开发(8) 多媒体消息回复

    这篇文章主要为大家详细介绍了Java微信公众平台开发第八步,微信多媒体消息回复,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-04-04
  • 将JavaDoc注释生成API文档的操作

    将JavaDoc注释生成API文档的操作

    这篇文章主要介绍了将JavaDoc注释生成API文档的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-11-11
  • 使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

    使用IDEA异常断点来定位java.lang.ArrayStoreException的问题

    这篇文章主要介绍了使用IDEA异常断点来定位java.lang.ArrayStoreException的问题,平常开发过程中面对这种描述不够清楚,无法定位具体原因的问题该如何处理,下面我们来一起学习一下吧
    2019-06-06
  • 在IDEA中集成maven详细流程图示例

    在IDEA中集成maven详细流程图示例

    最近利用两天时间学习了MyBatis以及maven,避免经典的学过就忘记,我打算做出点总结以便日后复习,当然如果能帮到需要的人也是极好的,需要的朋友可以参考下
    2021-06-06
  • Mybatis自关联查询一对多查询的实现示例

    Mybatis自关联查询一对多查询的实现示例

    这篇文章主要介绍了Mybatis自关联查询一对多查询的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • java中list.forEach()和list.stream().forEach()区别

    java中list.forEach()和list.stream().forEach()区别

    这篇文章主要介绍了java中list.forEach()和list.stream().forEach()区别,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-03-03
  • listview点击无效的处理方法(推荐)

    listview点击无效的处理方法(推荐)

    下面小编就为大家带来一篇listview点击无效的处理方法(推荐)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-05-05
  • Spring Boot 2.x基础教程之使用@Scheduled实现定时任务的方法

    Spring Boot 2.x基础教程之使用@Scheduled实现定时任务的方法

    在Spring Boot中编写定时任务是非常简单的事,下面通过实例介绍如何在Spring Boot中创建定时任务,实现每过5秒输出一个当前时间,感兴趣的朋友跟随小编一起看看吧
    2021-07-07

最新评论