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