前言:上面梳理了經過註解來隱式的完成了組件的掃描和自動裝配,下面來學習下如何經過顯式的配置的裝配bean;安全
使用場景:好比說,你想要將第三方庫中的組件裝配到你的應用中,在這種狀況下,是沒有辦法在它的類上添加@Component和@Autowired註解的,所以就不能使用自動化裝配的方案了。學習
在使用第三方jar包狀況下,你必需要採用顯式裝配的方式。在進行顯式配置的時候,有兩種可選方案:Java和XML。在這節中,咱們將會學習如何使用Java配置,接下來的一節中將會繼續學習Spring的XML配置3d
就像我以前所說的,在進行顯式配置時,JavaConfig是更好的方案,由於它更爲強大、類型安全而且對重構友好。由於它就是Java代碼,就像應用程序中的其餘Java代碼同樣。同時,JavaConfig與其餘的Java代碼又有所區別,在概念上,它與應用程序中的業務邏輯和領域代碼是不一樣的。儘管它與其餘的組件同樣都使用相同的語言進行表述,但JavaConfig是配置代碼。這意味着它不該該包含任何業務邏輯,JavaConfig也不該該侵入到業務邏輯代碼之中。儘管不是必須的,但一般會將JavaConfig放到單獨的包中,使它與其餘的應用程序邏輯分離開來,這樣對於它的意圖就不會產生困惑了對象
要在JavaConfig中聲明bean,@Bean註解會告訴Spring這個方法將會返回一個對象,該對象要註冊爲Spring應用上下文中的bean。方法體中包含了最終產生bean實例的邏輯。blog
下面的代碼聲明瞭CompactDisc bean:自動化
默認狀況下,bean的ID與帶有@Bean註解的方法名是同樣的。在本例中,bean的名字將會是sgtPeppers。若是你想爲其設置成一個不一樣的名字的話,那麼能夠重命名該方法,也能夠經過name屬性指定一個不一樣的名字:重構
在JavaConfig中,如何將CompactDisc注入到CDPlayer之中?配置
例如,下面就是一種聲明CDPlayer的可行方案:引用
注入過程:看起來,CompactDisc是經過調用sgtPeppers()獲得的,但狀況並不是徹底如此。由於sgtPeppers()方法上添加了@Bean註解,Spring將會攔截全部對它的調用,並確保直接返回該方法所建立的bean,而不是每次都對其進行實際的調用。請求
若是有多個其餘的bean注入同個實例,兩個CDPlayer bean會獲得相同的SgtPeppers實例。以下:
默認狀況下,Spring中的bean都是單例的,咱們並無必要爲第二個CDPlayer bean建立徹底相同的sgtPeppers實例。因此,Spring會攔截對sgtPeppers()的調用並確保返回的是Spring所建立的bean,也就是Spring自己在調用sgtPeppers()時所建立的CompactDiscbean。所以,兩個CDPlayer bean會獲得相同的SgtPeppers實例。
在這裏,cdPlayer()方法請求一個CompactDisc做爲參數。當Spring調用cdPlayer()建立CDPlayerbean的時候,它會自動裝配一個CompactDisc到配置方法之中。並且不用明確引用CompactDisc的@Bean方法。
經過這種方式引用其餘的bean一般是最佳的選擇,由於它不會要求將CompactDisc聲明到同一個配置類之中。在這裏甚至沒有要求CompactDisc必需要在JavaConfig中聲明,實際上它能夠經過組件掃描功能自動發現或者經過XML來進行配置。你能夠將配置分散到多個配置類、XML文件以及自動掃描和裝配bean之中,只要功能完整健全便可。無論CompactDisc是採用什麼方式建立出來的,Spring都會將其傳入到配置方法中,並用來建立CDPlayer bean。