Spring容器負責創建應用程序中的bean並通過依賴注入來協調這些對象之間的關系。但是,作為開發人員,要告訴Spring需要創建哪些bean並且如何將其裝配在一起。當描述bean如何裝配時,Spring提供了兩種主要的配置方式。
基於Java的配置
隱式配置
Spring通過組件掃描來實現隱式配置。
組件掃描
- 如果在類上使用了
@Component
注解,則表明該類會作為組件類,並告知Spring要為這個類創建bean。 - 組件掃描默認不開啟,需要在配置類上使用
@ComponentScan
注解。默認情況下@ComponentScan
會掃描與配置類相同的包。任何這個包以及這個包下的所有子包中帶有@Component
注解的類都會被掃描。 - 可以為
@ComponentScan
設置basePackages
屬性來顯式指定要掃描的基礎包。指定時有三種實現方式:- 以
String
的形式來指定 -@ComponentScan(basePackages="myPackage")
。此方式類型不安全,重構代碼后指定的基礎包可能會出現錯誤。 - 指定為包中所含的類或接口 -
@ComponentScan(basePackages="Student.class")
。 - 創建一個用來進行掃描的空標記接口。(推薦)
- 以
- 使用了
@Component
注解的會得到一個類名首字母小寫的bean ID。
顯式配置
有些時候是不太適合使用隱式裝配的,比如要將第三方庫中的組件裝配到自己的代碼的時候。
- 需要為配置類添加一個
@Configuration
注解,表明該類是一個配置類,包含了如何Spring容器如何創建bean的細節。 - 要在配置類中聲明bean,需要編寫一個帶有
@Bean
注解的方法,這個方法會創建所需類型的實例並返回。@Bean
注解會告訴Spring該方法將會返回一個對象,該對象要注冊成為Spring應用上下文中的bean,方法體中包含了產生bean實例的邏輯。 - 默認情況下,生成的bean ID和帶有
@Bean
的方法的方法名相同。 - 對帶有
@Bean
注解的方法的所有調用都會被Spring攔截,以此確保會直接返回該方法所創建的bean,而不是每次都對其進行實際調用。 - 可以在配置類中直接引用其它的bean而不需加
@autowired
注解。
自動裝配
簡單來說,自動裝配就是讓Spring自動滿足依賴的一種方法,在滿足依賴的過程中,會在Spring上下文中尋找所需要的其它bean。為了聲明要進行自動裝配,可以使用@Autowired
注解。
@Autowired
注解可以用在類的任何方法上。@Autowired
會根據所需bean的類型來進行搜索。- 如果沒有匹配的bean,那么Spring將會拋出一個異常。為了避免異常的出現,可以將
@Autowired
的required
屬性設置為false
。 - 在聲明bean時,可以為其中一個可選的bean添加
@Primary
注解來標記其為首選,從而避免自動裝配時多個bean可以選的歧義性。