Sping實戰之通過JAVA代碼裝配Bean

來源:互聯網
上載者:User

標籤:自動化   情況下   注入   ima   cbe   autowired   掃描   AC   而不是   

  儘管在很多情境下通過組件掃描和自動裝配實現Spring的自動化配置是更為推薦的方式,但有時候自動化配置的方案行不通,因此需要明確配置Spring。比如說,你想要將第三方庫中的組件裝配到你的應用中,在這種情況下,是沒有辦法在它的類上添加@Component和@Autowired註解的,因此就不能使用自動化裝配的方案了。

 

  在這種情況下,你必須要採用顯式裝配的方式。在進行顯式配置的時候,有兩種可選方案:Java和XML。在這節中,我們將會學習如何使用Java配置,接下來的一節中將會繼續學習Spring的XML配置

  就像我之前所說的,在進行顯式配置時,JavaConfig是更好的方案,因為它更為強大、型別安全並且對重構友好。因為它就是Java代碼,就像應用程式中的其他Java代碼一樣。同時,JavaConfig與其他的Java代碼又有所區別,在概念上,它與應用程式中的商務邏輯和領域代碼是不同的。儘管它與其他的組件一樣都使用相同的語言進行表述,但JavaConfig是配置代碼。這意味著它不應該包含任何商務邏輯,JavaConfig也不應該侵入到商務邏輯代碼之中。儘管不是必須的,但通常會將JavaConfig放到單獨的包中,使它與其他的應用程式邏輯分離開來,這樣對於它的意圖就不會產生困惑了

  

1.1藉助JavaConfig實現注入

我們需要聲明CDPlayerbean,它依賴於CompactDisc。在JavaConfig中,要如何將它們裝配在一起呢?

下面就是一種聲明CDPlayer的可行方案

  cdPlayer()方法像sgtPeppers()方法一樣,同樣使用了@Bean註解,這表明這個方法會建立一個bean執行個體並將其註冊到Spring應用上下文中。所建立的bean ID為cdPlayer,與方法的名字相同。

看起來,CompactDisc是通過調用sgtPeppers()得到的,但情況並非完全如此。因為sgtPeppers()方法上添加了@Bean註解,Spring將會攔截所有對它的調用,並確保直接返回該方法所建立的

bean,而不是每次都對其進行實際的調用。

  

  比如說,假設你引入了一個其他的CDPlayerbean,它和之前的那個bean完全一樣:

  假如對sgtPeppers()的調用就像其他的Java方法調用一樣的話,那麼每個CDPlayer執行個體都會有一個自己特有的SgtPeppers執行個體。如果我們討論的是實際的CD播放器和CD光碟片的話,這麼做是有意義的。如果你有兩台CD播放器,在物理上並沒有辦法將同一張CD光碟片放到兩個CD播放器中。但是,在軟體領域中,我們完全可以將同一個SgtPeppers執行個體注入到任意數量的其他bean之中。預設情況下,Spring中的bean都是單例的,我們並沒有必要為第二個CDPlayer bean建立完全相同的SgtPeppers執行個體。所以,Spring會攔截對sgtPeppers()的調用並確保返回的是Spring所建立的bean,也就是Spring本身在調用sgtPeppers()時所建立的CompactDiscbean。因此,兩個CDPlayer bean會得到相同的SgtPeppers執行個體。

  可以看到,通過調用方法來引用bean的方式有點令人困惑。其實還有一種理解起來更為簡單的方式:

  在這裡,cdPlayer()方法請求一個CompactDisc作為參數。當Spring調用cdPlayer()建立CDPlayerbean的時候,它會自動裝配一個CompactDisc到配置方法之中。然後,方法體就可以按照合適的方式來使用它。藉助這種技術,cdPlayer()方法也能夠將CompactDisc注入到CDPlayer的構造器中,而且不用明確引用CompactDisc的@Bean方法

  

  通過這種方式引用其他的bean通常是最佳的選擇,因為它不會要求將CompactDisc聲明到同一個配置類之中。在這裡甚至沒有要求CompactDisc必須要在JavaConfig中聲明,實際上它可以通過組件掃描功能自動探索或者通過XML來進行配置。你可以將配置分散到多個配置類、XML檔案以及自動掃描和裝配bean之中,只要功能完整健全即可。不管CompactDisc是採用什麼方式建立出來的,Spring都會將其傳入到配置方法中,並用來建立CDPlayer bean。

  再次強調一遍,帶有@Bean註解的方法可以採用任何必要的Java功能來產生bean執行個體。構造器和Setter方法只是@Bean方法的兩個簡單樣例。這裡所存在的可能性僅僅受到Java語言的限制。

Sping實戰之通過JAVA代碼裝配Bean

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.