Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean
@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的更多相关文章
- spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,guava限流,定时任务案例, 发邮件
本文介绍spring boot集成swagger,自定义注解,拦截器,xss过滤,异步调用,定时任务案例 集成swagger--对于做前后端分离的项目,后端只需要提供接口访问,swagger提供了接口 ...
- Spring Boot 2.0 教程 | @ModelAttribute 注解
欢迎关注微信公众号: 小哈学Java 文章首发于个人网站: https://www.exception.site/springboot/spring-boot-model-attribute Spri ...
- Spring Boot集成JPA的Column注解命名字段无效的问题
偶然发现,Spring Boot集成jpa编写实体类的时候,默认使用的命名策略是下划线分隔的字段命名. Spring Boot版本:1.5.4.release 数据表: id int, userNam ...
- Spring Boot系列——AOP配自定义注解的最佳实践
AOP(Aspect Oriented Programming),即面向切面编程,是Spring框架的大杀器之一. 首先,我声明下,我不是来系统介绍什么是AOP,更不是照本宣科讲解什么是连接点.切面. ...
- 必须知道的Spring Boot中的一些Controller注解
这篇文章是抄其他人的,原址:https://cloud.tencent.com/developer/article/1082720 本文旨在向你介绍在Spring Boot中controller中最基 ...
- Spring Boot(四)@EnableXXX注解分析
在学习使用springboot过程中,我们经常碰到以@Enable开头的注解,其实早在Spring3中就已经出现了类似注解,比如@EnableTransactionManagement.@ Enabl ...
- spring boot的ComponentScan和ServletComponentScan注解
ComponentScan 这个注解可以扫描带@Component的类.众所皆知,@RestController和@Configuration和@Service和@Configuration等都有带C ...
- 精尽Spring Boot源码分析 - @ConfigurationProperties 注解的实现
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- spring boot 使用拦截器,注解 实现 权限过滤
http://www.cnblogs.com/zhangXingSheng/p/7744997.html spring boot 使用拦截器 实现 用户登录拦截 http://www.cnblogs. ...
随机推荐
- Jira8.0.2安装及破解
最近开发部总监需要部署JIRA管理项目,就安装了一个JIRA8.5.7版安装并破解后,有天断电重启了,发现启动不了提示连接不上数据库.后来我又换了台机器重新安装后又进行了重启发现此破解版本存在问题.并 ...
- 《Shader入门精要》第11章-11.3.1流动的河流中的offset.x的解释
在我学习入门精要的时候,经常遇到不解释api,甚至是关键代码的实现原理. 11.3.1流动的河流中的offset.x的sin函数查了一下好像大家也都是书上原话直接复制,现在好不容易想明白了希望能帮到和 ...
- github:git clone下载加速以及vim-plug下载插件加速
git clone 下载加速 1. 先在github将仓库地址复制下来 2. git clone时将https://github.com/* 改为https://gitclone.com/github ...
- Oneops运维系统
背景:公司对接其他系统时都会将业务分为几大模块由不同的人员去开发部署.那么部署方式为传统方式登录服务器,然后操作.所以每次上线我们可能都需要等待别的同事操作完才能操作自己所负责的业务系统.针对以上 ...
- go语言学习入门篇1---go语言的主要特性与发展
1.1 影响 Go 语言发展的早期编程语言 正如 "21 世纪的 C 语言" 这句话所说,Go 语言并不是凭空而造的,而是和 C++.Java 和 C# 一样属于 C 系.不仅如此 ...
- 提升组件库通用能力 - NutUI 在线主题定制功能探索
开发背景 NutUI 作为京东风格的组件库,已具备 H5 和多端小程序开发能力.随着业务的不断发展,组件库的应用场景越来越广.在公司内外面临诸如科技.金融.物流等各多个大型团队使用时,单一的京东 AP ...
- R数据分析:纵向分类结局的分析-马尔可夫多态模型的理解与实操
今天要给大家分享的统计方法是马尔可夫多态模型,思路来源是下面这篇文章: Ward DD, Wallace LMK, Rockwood K Cumulative health deficits, APO ...
- 羽夏笔记——Hook攻防基础
写在前面 本笔记是由本人独自整理出来的,图片来源于网络.本人非计算机专业,可能对本教程涉及的事物没有了解的足够深入,如有错误,欢迎批评指正. 如有好的建议,欢迎反馈.码字不易,如果本篇文章有帮助你 ...
- 深入理解Java虚拟机-走进Java
一.Java技术体系 从广义上讲, Clojure. JRuby. Groovy等运行于Java虚拟机上的语言及其相关的程序都属于Java技术体系中的一员. 如果仅从传统意义上来看, Sun官方所定义 ...
- nginx简介&nginx基本配置和优化
一.nginx简介 1.nginx的发展 Nginx是俄罗斯人编写的一款高性能HTTP和反向代理服务器.Nginx能够选择高效的epoll(Linux2.6内核).kqueue(FreeBSD).ev ...