Spring基于@Conditional條件化裝配bean
一 前言
理解spring的如何根據(jù)條件裝配bean有助于我們更好使用springboot進行開發(fā),和源碼理解;
二 @Conditional 裝配bean
思路如下
Spring中提供了@Conditional注解實現(xiàn)條件化是否裝配bean,這樣可以根據(jù)條件動態(tài)的裝配bean;
要判定@Conditional 注解是否該裝配bean還需要Condition 接口配合,我們只須實現(xiàn) Condition 接口,重寫matches 方法;
根據(jù)matches方法返回的布爾值進行判定@Conditional是否需要裝配bean
實現(xiàn)過程如下
2.1 用戶類
用戶類用于配置類是否裝配該Bean
/** * @Author lsc * <p> </p> */public class User { private String userName;// 省略 set get}
2.2 Condition實現(xiàn)類
RuntimeExist 實現(xiàn) Condition ,使用 conditionContext 獲取jvm 環(huán)境變量,如果存在則返回 true ,否則返回false;其中conditionContext還有如下方法
getRegistry():使用BeanDefinitionRegistry的檢查bean定義; getBeanFactory():使用ConfigurableListableBeanFactory檢查bean是否存在; getEnvironment():Environment環(huán)境變量 getResourceLoader():ResourceLoader加載的資源; getClassLoader():ClassLoader加載的類。public class RuntimeExist implements Condition { public boolean matches(ConditionContext conditionContext, AnnotatedTypeMetadata annotatedTypeMetadata) { // 獲取jvm 運行時環(huán)境 Environment environment = conditionContext.getEnvironment(); // 檢查 jvm 運行時環(huán)境是否存在屬性 return environment.containsProperty('java.runtime.name'); }}
2.3 用戶配置類
根據(jù) RuntimeExist的 matches 方法的返回值 是否裝配bean; 這邊設(shè)置了屬性名稱 zszxz,以便于更好的測試;
/** * @Author lsc * <p> </p> */@Configurationpublic class UserConfig { @Bean // 根據(jù) RuntimeExist的 matches 方法的返回值 是否裝配bean @Conditional(RuntimeExist.class) public User user(){ User user = new User(); user.setUserName('zszxz'); return user; }}
2.4 測試
由于 jvm 運行時環(huán)境存在 java.runtime.name 屬性 ,故會裝配成功,會打印出 zszxz ;
如果將 java.runtime.name 改為 任意jvm 運行時不存在的屬性 ,測試就會報異常;
@RunWith(SpringJUnit4ClassRunner.class)//創(chuàng)建spring應(yīng)用上下文@ContextConfiguration(classes= UserConfig.class)//加載配置類public class ConditionTest { @Autowired User user; @Test public void test(){ // zszxz System.out.println(user.getUserName()); }}
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。
相關(guān)文章:
1. asp.net core服務(wù)限制堆內(nèi)存大小的操作方法2. 解決ajax請求后臺,有時收不到返回值的問題3. SpringMVC+Jquery實現(xiàn)Ajax功能4. 使用IDEA編寫jsp時EL表達式不起作用的問題及解決方法5. ASP.NET MVC實現(xiàn)單個圖片上傳、限制圖片格式與大小并在服務(wù)端裁剪圖片6. jstl 字符串處理函數(shù)7. .NET 6 跨服務(wù)器聯(lián)表查詢操作MySql、Oracle、SqlServer等相互聯(lián)表8. ThinkPHP5 通過ajax插入圖片并實時顯示(完整代碼)9. ASP.NET Core 依賴注入生命周期示例詳解10. 讀大數(shù)據(jù)量的XML文件的讀取問題
