<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
@Conditional註解,是根據條件進行裝配。滿足了 Conditional 指定的條件,就進行元件的注入。
另外@Conditional是個根註解,在idea裡使用 ctrl+H 可以開啟它的結構。
可以看到有許多的派生註解,每個註解都代表著一種功能。比如:
@ConditionalOnBean:當容器中存在指定的元件,才會做某些事情。
@ConditionalOnMissingBean:當容器中沒有指定的元件,才會做某些事情。
@ConditionalOnClass:當容器中存在指定的類。
@ConditionalOnMissingClass:當容器中不存在指定的類。
@ConditionalOnResource:專案類路徑裡存在某個資源的時候。
@ConditionalOnJava:當是指定的 java 版本號。
@ConditionalOnWebApplication:當應用是一個 web 應用的時候。
@ConditionalOnNotWebApplication:當應用不是一個 web 應用的時候。
@ConditionalOnProperty:當組態檔裡存在指定屬性的時候。
以@ConditionalOnBean為例,演示一下用法。
還是看一下之前 MyConfig 類中的方法:
@Import({User.class, DBHelper.class}) @Configuration(proxyBeanMethods = true) public class MyConfig { @Bean("user1") public User user01(){ User pingguo = new User("pingguo",20); pingguo.setPet(tomcatPet()); return pingguo; } // @Bean("pet1") public Pet tomcatPet(){ return new Pet("tomcat"); } }
在這裡,我把pet1這個元件給註釋掉,現在tomcatPet()其實就是個普通的類方法。
先嚐試在主執行類的 main 方法裡獲取一下 這 2 個 元件:
@SpringBootApplication(scanBasePackages = "com.pingguo") public class MainApplication { public static void main(String[] args) { // 返回IOC容器 final ConfigurableApplicationContext run = SpringApplication.run(MainApplication.class, args); boolean tomcatPet = run.containsBean("pet1"); System.out.println("容器中存在 pet1 的元件:" + tomcatPet); boolean user1 = run.containsBean("user1"); System.out.println("容器中存在 user1 的元件:" + user1); } }
執行一下,檢視結果:
果然,是不存在pet1元件的,因為@bean這個註解被我註釋掉了。
OK,現在我有個需求,因為user1元件依賴pet1元件,如果沒有pet1,我希望user1元件也直接別註冊了。
這時候就可以使用@ConditionalOnBean註解來完成。
@Import({User.class, DBHelper.class}) @Configuration(proxyBeanMethods = true) public class MyConfig { @ConditionalOnBean(name = "pet1") @Bean("user1") public User user01(){ User pingguo = new User("pingguo",20); pingguo.setPet(tomcatPet()); return pingguo; } // @Bean("pet1") public Pet tomcatPet(){ return new Pet("tomcat"); } }
在 user1元件上加上@ConditionalOnBean(name = "pet1"),當沒有pet1元件,就不註冊user1元件。
現在再執行 main 方法測試一下,應該都是 false,2個元件都不存在。
作用在類上
@ConditionalOnBean(name = "pet1")如果我放在類上:
@ConditionalOnBean(name = "pet1") // 放在類上 @Import({User.class, DBHelper.class}) @Configuration(proxyBeanMethods = true) public class MyConfig { @Bean("user1") public User user01(){ User pingguo = new User("pingguo",20); pingguo.setPet(tomcatPet()); return pingguo; } @Bean("pet22") public Pet tomcatPet(){ return new Pet("tomcat"); } }
現在就表示,當存在pet1元件的時候,這個類下面的所有才會生效。
這裡我改了下面的元件註冊變成pet22,也就是說當存在pet1元件的時候,就會註冊user1和pet22。
在 main 方法裡增加列印pet22,檢視是否存在:
... ... boolean pet22 = run.containsBean("pet22"); System.out.println("容器中存在 pet22 的元件:" + pet22); ... ...
執行一下:
因為不存在pet1這個元件,所有MyConfig類下面的2個元件user1和pet22的註冊都不生效。
@ImportResource註解是用來匯入資源。
比如,之前我們可能會在 spring 組態檔中寫非常多的元件匯入:
... ... <bean id="haha" class="com.pingguo.boot.bean.User"> <property name="name" value="pingguo"></property> <property name="age" value="20"></property> </bean> <bean id="hehe" class="com.pingguo.boot.bean.User"> <property name="name" value="tomcat"></property> </bean>
這裡只是demo,實際工程中可能會存在很多 bean,如果想要逐個遷移成註解的方式,會很麻煩。
但是現在容器裡又是沒有這些元件的,在 main 方法裡輸出測試一下:
boolean haha = run.containsBean("haha"); System.out.println("容器中存在 haha 的元件:" + haha); boolean hehe = run.containsBean("hehe"); System.out.println("容器中存在 hehe 的元件:" + hehe);
因為這些元件宣告在 xml 裡,springboot 也並不知道這些是幹嘛的。
這時候就可以使用@ImportResource來匯入這些元件:
//@ConditionalOnBean(name = "pet1") @Import({User.class, DBHelper.class}) @Configuration(proxyBeanMethods = true) @ImportResource("classpath:beans.xml") //組態檔的類路徑 public class MyConfig { @Bean("user1") public User user01(){ User pingguo = new User("pingguo",20); pingguo.setPet(tomcatPet()); return pingguo; } @Bean("pet22") public Pet tomcatPet(){ return new Pet("tomcat"); } }
這個時候再執行測試一下:
xml 組態檔裡的元件被成功解析註冊到了容器中。
以上就是淺析SpringBoot2底層註解@Conditional@ImportResource的詳細內容,更多關於SpringBoot2底層註解的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45