摘要:介紹在配置和直接注解式配置之外還有一種有趣的選擇方式,是指基于配置的。傳統(tǒng)的一般都是基本配置的,后來新增了許多的注解,特別是,基本都是清一色的。代碼如下創(chuàng)建對象創(chuàng)建對象創(chuàng)建一個對象運行后的兩種結(jié)果
1.javaconfig介紹
在XML配置和直接注解式配置之外還有一種有趣的選擇方式-JavaConfig,java config是指基于java配置的spring。傳統(tǒng)的Spring一般都是基本xml配置的,后來spring3.0新增了許多java config的注解,特別是spring boot,基本都是清一色的java config。下面用一段簡單的程序來演示.
完整代碼已上傳github:https://github.com/SunPiHai/s...
4. 代碼說明和實現(xiàn)org.springframework spring-context 4.3.13.RELEASE org.springframework spring-test 4.3.13.RELEASE
Dao層和Service層不贅述了,簡單實現(xiàn)一個add()方法AppConfig配置類
用@Configuration注解該類,等價 與XML中配置beans;用@Bean標注方法等價于XML中配置bean,被注解的類內(nèi)部包含有一個或多個被@Bean注解的方法
UserDaoNormal
@Configuration public class AppConfig { @Bean public UserDao userDaoNormal(){ System.out.println("創(chuàng)建UserDaoNormal對象"); return new UserDaoNormal(); @Bean public UserDao userDaoCache() { System.out.println("創(chuàng)建UserDaoCache對象"); return new UserDaoCache(); } @Bean public UserService userServiceNormal(UserDao userDao){ System.out.println("創(chuàng)建一個UserService對象"); return new UserServiceNormal(userDao); } }UserServiceTest測試類
@RunWith(SpringJUnit4ClassRunner.class),讓測試運行于Spring測試環(huán)境
@ContextConfiguration Spring整合JUnit4測試時,使用注解引入多個配置文件
多個配置文件:@ContextConfiguration(locations = { "classpath:/spring1.xml", "classpath:/spring2.xml" })
@RunWith(SpringJUnit4ClassRunner.class) @ContextConfiguration(classes = AppConfig.class) public class UserServiceTest { @Autowired private UserService userService; @Test public void addTest(){ userService.add(); } }5.處理自動裝配的歧義性
運行后卻報異常出錯!
問題是出現(xiàn)了依賴注入的歧義性,UserDao不能夠進行自動裝配.簡單來說,在spring容器中找到了一個以上的UserDao類型的對象,所以不知道到底要哪個,我在UserDao接口寫了兩個實現(xiàn)add()方法的類,有一個UserDaoNormal對象和一個UserDaoCache對象,所以無法正常進行依賴注入.
解決的辦法有幾個:
在AppConfig配置文件里根據(jù)需要在兩個對象方法上在其中一個添加 @primary注解,說明這個對象是依賴注入的首選bean.
2.@Qualifier注解Qualifier的意思是合格者,通過這個標示,表明了哪個實現(xiàn)類才是我們所需要的,添加@Qualifier注解,需要注意的是@Qualifier的參數(shù)名稱為我們之前定義@Qualifier注解的名稱之一。
代碼如下
@Configuration public class AppConfig { @Bean @Qualifier("normal") public UserDao userDaoNormal(){ System.out.println("創(chuàng)建UserDaoNormal對象"); return new UserDaoNormal(); } @Bean @Qualifier("cache") public UserDao userDaoCache() { System.out.println("創(chuàng)建UserDaoCache對象"); return new UserDaoCache(); } @Bean public UserService userServiceNormal(@Qualifier("normal") UserDao userDao){ System.out.println("創(chuàng)建一個UserService對象"); return new UserServiceNormal(userDao); } }3.@Qualifier注解和bean id
同樣的,@Qualifier的參數(shù)名稱為我們之前定義@bean注解的名稱之一。
代碼如下:
@Bean("normal") public UserDao userDaoNormal(){ System.out.println("創(chuàng)建UserDaoNormal對象"); return new UserDaoNormal(); } @Bean("cache") public UserDao userDaoCache() { System.out.println("創(chuàng)建UserDaoCache對象"); return new UserDaoCache(); } @Bean public UserService userServiceNormal(@Qualifier("normal") UserDao userDao){ System.out.println("創(chuàng)建一個UserService對象"); return new UserServiceNormal(userDao);
如果我們不給bean起一個約定的id,會有一個默認的id,實際上就是@bean所在的方法的方法名.@Qualifier的參數(shù)名稱為@bean所在的方法的方法名的名稱之一。
代碼如下:
@Bean public UserDao userDaoNormal(){ System.out.println("創(chuàng)建UserDaoNormal對象"); return new UserDaoNormal(); } @Bean public UserDao userDaoCache() { System.out.println("創(chuàng)建UserDaoCache對象"); return new UserDaoCache(); } @Bean public UserService userServiceNormal(@Qualifier("userDaoCache") UserDao userDao){ System.out.println("創(chuàng)建一個UserService對象"); return new UserServiceNormal(userDao); }6.運行后的兩種結(jié)果
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/73740.html
摘要:裝配提供了三種裝配機制在中進行顯示配置在中進行顯示配置隱式的發(fā)現(xiàn)機制和自動裝配機制。表示該類是一個組件,將自動創(chuàng)建該組件實例,表示注入組件實例,和功能類似,和功能類似,但和是規(guī)范中提供的注解。 基本原理 spring的基礎(chǔ)是IOC和DI,其實IOC和DI是對同一件事從不同的方面進行描述的,兩者在spring中是同一件事務。 IOC:控制反轉(zhuǎn),在這里就是指創(chuàng)建bean的主動權(quán)發(fā)生了轉(zhuǎn)移,...
摘要:高級裝配條件化的自動裝配與歧義性的作用域表達式語言環(huán)境與可以為不同的環(huán)境提供不同的數(shù)據(jù)庫配置加密算法等注解可以在類級別和方法級別,沒有指定的始終都會被創(chuàng)建的方式配置不同環(huán)境所需要的數(shù)據(jù)庫配置會搭建一個嵌入式的數(shù)據(jù)庫模式定義在測試數(shù)據(jù)通過加 高級裝配 Spring profile 條件化的bean 自動裝配與歧義性 bean的作用域 Spring表達式語言 環(huán)境與profile p...
摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統(tǒng)一配置,便于修改。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 工廠模式理解了沒有? 在刷Spring書籍的時候花了點時間去學習了單例模式和工廠模式,總的來說還是非常值得的! 本來想的是刷完《Spring 實戰(zhàn) (第4版)》和《精通Spring4.x 企業(yè)應用開發(fā)實戰(zhàn)》...
摘要:裝配任何一個成功的應用都是由多個為了實現(xiàn)某個業(yè)務目標而相互協(xié)作的組件構(gòu)成的創(chuàng)建應用對象之間協(xié)作關(guān)系的行為通常稱為裝配,這也是依賴注入配置的可選方案在中進行顯示配置在中進行顯示配置隱式的發(fā)現(xiàn)機制和自動裝配自動化裝配組件掃描會自動發(fā)現(xiàn)應用上下文 裝配Bean 任何一個成功的應用都是由多個為了實現(xiàn)某個業(yè)務目標而相互協(xié)作的組件構(gòu)成的 創(chuàng)建應用對象之間協(xié)作關(guān)系的行為通常稱為裝配(wiring)...
摘要:構(gòu)造器自動裝配方法自動裝配其他方法自動裝配不管是構(gòu)造器,方法還是其他的方法,都會去嘗試滿足方法參數(shù)上所聲明的依賴。所以上面的輸出是構(gòu)造器自動裝配方法自動裝配其他方法自動裝配使用進行自動裝配的時候,需要注意一下幾點。 完整代碼請見:https://github.com/codercuixi... 創(chuàng)建應用對象之間協(xié)作關(guān)系的行為通常稱為裝配(wiring),這也是依賴注入(DI)的本質(zhì)。 ...
閱讀 3952·2021-11-11 10:58
閱讀 3321·2021-09-26 09:46
閱讀 1912·2019-08-30 15:55
閱讀 976·2019-08-30 13:52
閱讀 1944·2019-08-29 13:11
閱讀 3024·2019-08-29 11:27
閱讀 1517·2019-08-26 18:18
閱讀 2619·2019-08-23 14:17