日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring Boot-@Conditional注解以及衍生注解@ConditionalOnBean

發布時間:2024/10/5 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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組件

@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的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。