@Conditional:判断@Conditional指定的条件是否成立,如果成立才会给容器中添加组件,配置类里面的内容才会生效



我们发现有很多的自动配置类,但是这些自动配置类都有指定的条件,必须满足这些条件,自动配置才会生效,比如


那我们怎么查看哪些自动配置类生效了呢
可以通过debug模式
1.application.properties配置以下内容

2.启动运行我们就可以查看到哪些自动配置类生效了
Positive matches:代表生效的自动配置类
Negative matches:没有生效的自动配置类


然后通过实例进行测试 1.编写Admin类

/**
* @author:抱着鱼睡觉的喵喵
* @date:2020/12/22
* @description:
*/
public class Admin {
private String name;
private String img; public Admin() {
} public Admin(String name, String img) {
this.name = name;
this.img = img;
} @Override
public String toString() {
return "admin{" +
"name='" + name + '\'' +
", img='" + img + '\'' +
'}';
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
}
}

2.编写配置类

@Configuration(proxyBeanMethods = true)//proxyBeanMethods = true为默认值
public class MyConfig { // @Bean("admin")
public Admin admin(){
return new Admin("jerry","@the");
}
}

3.主配置文件

@SpringBootApplication
public class SpringBootOnApplication { public static void main(String[] args) {
ConfigurableApplicationContext run=SpringApplication.run(SpringBootOnApplication.class, args); boolean admin = run.containsBean("admin");
System.out.println(admin);
} }

结果:false
说明容器中没有这个组件

-将配置类中的组件导入

@Configuration(proxyBeanMethods = true)//proxyBeanMethods = true为默认值
public class MyConfig { @Bean("admin")
public Admin admin(){
return new Admin("jerry","@the");
}
}

结果:true

那么真正的测试就开始了,使用衍生注解@ConditionOnBean

编写User类

public class User {

    private String username;

    private String password;

    private int age;

    private Admin admin;

    public Admin getAdmin() {
return admin;
} public void setAdmin(Admin admin) {
this.admin = admin;
} public User() {
} public User(String username, String password, int age) {
this.username = username;
this.password = password;
this.age = age;
} public String getUsername() {
return username;
} public void setUsername(String username) {
this.username = username;
} public String getPassword() {
return password;
} public void setPassword(String password) {
this.password = password;
} public int getAge() {
return age;
} public void setAge(int age) {
this.age = age;
} @Override
public String toString() {
return "User{" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", age=" + age +
", admin=" + admin +
'}';
}
}

配置类中增加组件导入,使用@ConditionOnBean注解进行判断
下面的意思是如果容器中不存在admin组件,则也不导入hao组件

@Configuration(proxyBeanMethods = true)
public class MyConfig { @ConditionalOnBean(name = "admin")
@Bean("hao")
public User user(){
User tom = new User("tom", "123", 20);
//hao组件依赖了admin组件
tom.setAdmin(admin());
return tom;
} @Bean("admin")
public Admin admin(){
return new Admin("jerry","@the");
}
}

主配置文件

@SpringBootApplication
public class SpringBootOnApplication { public static void main(String[] args) {
ConfigurableApplicationContext run=SpringApplication.run(SpringBootOnApplication.class, args); boolean user = run.containsBean("hao");
System.out.println(user);
boolean admin = run.containsBean("admin");
System.out.println(admin);
} }

运行结果:
false
true

为什么会这样呢?分析流程可得,把配置类中的admin组件注册放在user组件注册之后,当程序运行时,执行到user()方法时,由于加了@ConditionOnBean注解,所以会进行判断,看容器中是否存在admin组件,由于admin()方法还未执行,所以容器中没有admin组件;所以此时@ConditionOnBean注解返回false,则不再执行user()方法;即user组件不再导入

我们将改变组件的导入顺序

@Configuration(proxyBeanMethods = true)
public class MyConfig { @Bean("admin")
public Admin admin(){
return new Admin("jerry","@the");
} @ConditionalOnBean(name = "admin")
@Bean("hao")
public User user(){
User tom = new User("tom", "123", 20);
//hao组件依赖了admin组件
tom.setAdmin(admin());
return tom;
} }

再次运行
结果:
true
true


将@ConditionalOnBean注解添加到类的上面

@Configuration(proxyBeanMethods = false)
@ConditionalOnMissingBean (name = "admin")
public class MyConfig { @Bean("user")
public User user(){ //hao组件依赖了admin组件
return new User("tom", "123", 20);
} @Bean("admin")
public Admin admin(){
return new Admin("jerry","@the");
}
}

运行结果:
false
false

这就很容易了,由于事先容器中没有admin组件,所以此时ConditionalOnBean返回false,则这个配置类中的内容不在执行

Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean的更多相关文章

  1. spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件

    本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...

  2. Spring Boot 2.0 教程 | @ModelAttribute 注解

    欢迎关注微信公众号: 小哈学Java 文章首发于个人网站: https://www.exception.site/springboot/spring-boot-model-attribute Spri ...

  3. Spring Boot集成JPA的Column注解命名字段无效的问题

    偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名. Spring Boot版本:1.5.4.release 数据表: id int, userNam ...

  4. Spring Boot系列——AOP配自定义注解的最佳实践

    AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一. 首先,我声明下,我不是来系统介绍什么是AOP,更不是照本宣科讲解什么是连接点.切面. ...

  5. 必须知道的Spring Boot中的一些Controller注解

    这篇文章是抄其他人的,原址:https://cloud.tencent.com/developer/article/1082720 本文旨在向你介绍在Spring Boot中controller中最基 ...

  6. Spring Boot(四)@EnableXXX注解分析

    在学习使用springboot过程中,我们经常碰到以@Enable开头的注解,其实早在Spring3中就已经出现了类似注解,比如@EnableTransactionManagement.@ Enabl ...

  7. spring boot的ComponentScan和ServletComponentScan注解

    ComponentScan 这个注解可以扫描带@Component的类.众所皆知,@RestController和@Configuration和@Service和@Configuration等都有带C ...

  8. 精尽Spring Boot源码分析 - @ConfigurationProperties 注解的实现

    该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...

  9. spring boot 使用拦截器,注解 实现 权限过滤

    http://www.cnblogs.com/zhangXingSheng/p/7744997.html spring boot 使用拦截器 实现 用户登录拦截 http://www.cnblogs. ...

随机推荐

  1. Mac下如何自动备份目录到七牛云?

    原文链接 七牛云是个很好用的图床,但是 Mac 下并没有什么很好用的客户端,每次上传都需要在网页上手动一个个传文件,十分麻烦,于是仔细看了下七牛云的部分文档,打算使用QRSBox来自动上传图片. QR ...

  2. 最小生成树MST算法(Prim、Kruskal)

    最小生成树MST(Minimum Spanning Tree) (1)概念 一个有 n 个结点的连通图的生成树是原图的极小连通子图,且包含原图中的所有 n 个结点,并且有保持图连通的最少的边,所谓一个 ...

  3. 女朋友问我深浅copy到底是什么?

    深浅拷贝 列表存放值的时候,是先申请一块内存空间,存放索引和内存地址的对应关系,其实通俗的来说列表内不存真正的值,是一种间接存放的对应关系: 列表内存不可变类型的数据 就比如说,如果现在将L列表索引0 ...

  4. Docker——概述

    出现原因:开发接替运维的工作,将jar包连同(mysql,jdk)等环境上线 实现:java -> jar(环境) -> 打包项目带上环境(镜像) -> (Docker仓库:商店) ...

  5. Azure DevOps (五) 推送流水线制品到流水线仓库

    上一篇我们成功创建了我们的第一条流水线,并且配置了阿里云的maven加速,这篇文章我们来研究一下如何把编译好的代码上传到azure的流水线制品仓库中 为后续我们进行发布做准备 首先打开我们上一次编辑的 ...

  6. ElasticSearch7.3 学习之定制动态映射(dynamic mapping)

    1.dynamic mapping ElasticSearch中有一个非常重要的特性--动态映射,即索引文档前不需要创建索引.类型等信息,在索引的同时会自动完成索引.类型.映射的创建. 当ES在文档中 ...

  7. bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp)

    bzoj4032/luoguP4112 [HEOI2015]最短不公共子串(后缀自动机+序列自动机上dp) bzoj Luogu 题解时间 给两个小写字母串 $ A $ , $ B $ ,请你计算: ...

  8. 羽夏看Win系统内核——结语

    写在前面   此系列是本人一个字一个字码出来的,包括示例和实验截图.由于系统内核的复杂性,故可能有错误或者不全面的地方,如有错误,欢迎批评指正,本教程将会长期更新. 如有好的建议,欢迎反馈.码字不易, ...

  9. Java线程通信

    Java线程通信 螣蛇乘雾,终为土灰. 多个线程协同工作完成某个任务时就会涉及到线程间通信问题.如何使各个线程之间同时执行,顺序执行.交叉执行等. 一.线程同时执行 创建两个线程a和b,两个线程内调用 ...

  10. Java基础 - 注解详解

    What - 什么是注解?        Annontation是Java5开始引入的新特征,中文名称叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata)与程序元素( ...