Spring裝配Bean之用Java代碼安裝配置bean詳解
前言
本文主要給大家介紹了關(guān)于Spring之利用Java代碼安裝配置bean的相關(guān)內(nèi)容,盡管通過組件掃描和自動(dòng)裝配實(shí)現(xiàn)Spring的自動(dòng)化配置很方便也推薦,但是有時(shí)候自動(dòng)配置的方式實(shí)現(xiàn)不了,就需要明確顯示的配置Spring。比如說,想要將第三方庫中的組件裝配到自己的應(yīng)用中,這樣的情況下,是沒辦法在它的類上添加 @Compnent和 @Autowired注解的。
在這種情況下,需要使用顯示裝配的方式,可以分別通過Java和XML實(shí)現(xiàn),推薦使用Java的方式,因?yàn)楦訌?qiáng)大,類型安全并且重構(gòu)友好,因?yàn)榫秃臀覀儜?yīng)用所寫的Java代碼一樣。但是雖然JavaConfig和其他的java代碼沒有區(qū)別,但是在概念上是不同的。所以JavaConfig不應(yīng)該出現(xiàn)業(yè)務(wù)邏輯的代碼,并建議放在單獨(dú)的包中,做隔離。
創(chuàng)建配置類
在之前,看到過JavaConfig,我們?cè)倏匆幌拢?/p>
package soundsystem; import org.springframework.context.annotation.Configuration; @Configuration public class CDPlayerConfig { }
創(chuàng)建javaConfig類的關(guān)鍵在于為其添加 @Configuration注解,@Configuration注解表明這個(gè)類是一個(gè)配置類,該類應(yīng)該包含Spring上下文中如何創(chuàng)建bean的細(xì)節(jié)。之前我們都是依賴組件掃描來發(fā)現(xiàn)Spring應(yīng)該創(chuàng)建的bean。盡管可以同時(shí)使用組件掃描和顯示配置,但是現(xiàn)在我們?nèi)サ袅?@CompnentScan注解,現(xiàn)在的CDPlayerConfig類就沒有任何作用了。如果現(xiàn)在運(yùn)行之前的測(cè)試類,就會(huì)失敗,并且出現(xiàn)BeanCreationException異常。
聲明簡(jiǎn)單的bean
在JavaConfig中聲明bean,需要編寫一個(gè)方法,該方法會(huì)創(chuàng)建所需類型的實(shí)例,然后這個(gè)方法添加 @Bean注解。
@Bean public CompactDisc sgtPeppers() { return new SgtPeppers(); }
@Bean注解會(huì)告訴Spring這個(gè)方法會(huì)返回一個(gè)對(duì)象,該對(duì)象要注冊(cè)為Spring應(yīng)用上下文中的bean。
默認(rèn)情況下,bean的ID與帶有 @Bean注解的方法名是一樣的,在上面的例子中,bean的ID將會(huì)是sgtPeppers。如果想設(shè)置不同的ID,那么可以重命名該方法,也可以通過name屬性指定一個(gè)不通的名字:
@Bean(name="lonelyHeartsClubBand") public CompactDisc sgtPeppers() { return new SgtPeppers(); }
借助JavaConfig實(shí)現(xiàn)注入
前面聲明的CompactDisc很簡(jiǎn)單,因?yàn)闆]有其他依賴。但現(xiàn)在,我們需要聲明CDPlayer bean,它依賴于CompactDisc。
在javaConfig中裝配bean的最簡(jiǎn)單方式就是引用創(chuàng)建bean的方法。
@Bean public CDPlayer cdPlayer() { return new CDPlayer(sgtPeppers()); }
注意:看起來,CompactDisc是通過調(diào)用sgtPeppers()得到的,但情況并非完全如此。因?yàn)閟gtPeppers()方法添加了 @Bean注解,Spring會(huì)攔截所有對(duì)它的調(diào)用,并確保直接返回該方法創(chuàng)建的bean,而不是每次都進(jìn)行實(shí)際的調(diào)用。
假如引入另外一個(gè)CDPlayer bean,他和之前的那個(gè)bean完全一樣:
@Bean public CDPlayer cdPlayer() { return new CDPlayer(sgtPeppers()); } @Bean public CDPlayer anotherCDPlayer() { return new CDPlayer(sgtPeppers()); }
如果sgtPeppers()的調(diào)用是實(shí)際的方法調(diào)用,那么每個(gè)CDPlayer實(shí)例都會(huì)有一個(gè)特有的SgtPeppers實(shí)例。如果是實(shí)際的CD播放器和CD光盤的話,很ok,物理上沒辦法共用一張CD光盤在兩個(gè)CD播放器上。
但是,在軟件中,我們完全是可以將同一個(gè)SgtPeppers實(shí)例注入到任意數(shù)量的其它的bean中。默認(rèn)情況下,Spring的bean都是單例的,我們并沒有必要為第二個(gè)CDPlayer bean創(chuàng)建完全相同的SgtPeppers實(shí)例。
根本的問題在于,通過調(diào)用方法的方式來引入bean有點(diǎn)困惑,還有另外一種方式:
@Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { return new CDPlayer(compactDisc); }
通過這種方式引入其它的bean通常是最佳的方式,因?yàn)镾pring并不會(huì)要求將CompactDisc聲明放在同一個(gè)配置文件中,甚至不一定是JavaConfig中,可以將配置分布在XML、多個(gè)配置類以及自動(dòng)掃描裝配的bean中。
另外,這里的CDPlayer的構(gòu)造器實(shí)現(xiàn)了DI功能,但是我們完全可以根據(jù)需求實(shí)例化CDPlayer,比如想通過Setter方法注入CompactDisc的話,可以這樣:
@Bean public CDPlayer cdPlayer(CompactDisc compactDisc) { CDPlayer cdPlayer = new CDPlayer(compactDisc); cdPlayer.setCompactDisc = compactDisc; return cdPlayer; }
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java如何把數(shù)組轉(zhuǎn)換為ArrayList
這篇文章主要介紹了Java如何把數(shù)組轉(zhuǎn)換為ArrayList,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01Springboot MultipartFile文件上傳與下載的實(shí)現(xiàn)示例
在Spring Boot項(xiàng)目中,可以使用MultipartFile類來處理文件上傳和下載操作,本文就詳細(xì)介紹了如何使用,具有一定的參考價(jià)值,感興趣的可以了解一下2023-08-08Java使用Jedis操作Redis服務(wù)器的實(shí)例代碼
本篇文章主要介紹了Java使用Jedis操作Redis服務(wù)器的實(shí)例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-08-08idea中使用maven?archetype新建項(xiàng)目時(shí)卡住問題解決方案
這篇文章主要介紹了idea中使用maven?archetype新建項(xiàng)目時(shí)卡住,解決本問題的方法,就是在maven的runner加上參數(shù)-DarchetypeCatalog=local就可以了,不需要下載xml文件再放到指定目錄,需要的朋友可以參考下2023-08-08IntelliJ IDEA基于SpringBoot如何搭建SSM開發(fā)環(huán)境的步驟詳解
這篇文章主要介紹了IntelliJ IDEA基于SpringBoot如何搭建SSM開發(fā)環(huán)境,本文分步驟通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-10-10SpringMVC4.3?HttpMessageConverter接口實(shí)現(xiàn)源碼分析
這篇文章主要為大家介紹了SpringMVC4.3?HttpMessageConverter接口實(shí)現(xiàn)源碼分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-09-09淺析Java中Map與HashMap,Hashtable,HashSet的區(qū)別
HashMap和Hashtable兩個(gè)類都實(shí)現(xiàn)了Map接口,二者保存K-V對(duì)(key-value對(duì));HashSet則實(shí)現(xiàn)了Set接口,性質(zhì)類似于集合2013-09-09mybatis?plus框架@TableField注解不生效問題及解決方案
最近遇到一個(gè)mybatis plus的問題,@TableField注解不生效,導(dǎo)致查出來的字段反序列化后為空,今天通過本文給大家介紹下mybatis?plus框架的@TableField注解不生效問題總結(jié),需要的朋友可以參考下2022-03-03