javascript
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;}@Overridepublic 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;}@Overridepublic String toString() {return "User{" +"username='" + username + '\'' +", password='" + password + '\'' +", age=" + age +", admin=" + admin +'}';} }配置類中增加組件導入,使用@ConditionOnBean注解進行判斷
下面的意思是如果容器中不存在admin組件,則也不導入hao組件
主配置文件
@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-自动配置之底层原
- 下一篇: thymeleaf模板引擎