1.處理自動裝配的歧義性
自動裝配的時候,僅有一個bean匹配所需的結果時,自動裝配纔是最有效的,如果不僅有一個Bean能夠匹配結果的話,這種歧義性會阻礙Spring自動裝配屬性、構造參數或者方法參數。如上圖所示
當確實發生歧義性的時候,Spring提供了多種可選方案來解決這樣的問題。你可以將可選Bean中的某一個設爲首選(primary)的bean,或者使用限定符(qualifier)來幫助Spring將可選bean的範圍到只有一個Bean。
1.1標示首選的bean
@Primary能夠與@Component組合用在組件掃描的bean上,也可以與@Bean組合用在Java配置的bean聲明中。
如下圖所示距離
1.2限定自動裝配的bean
@Qualifier註解是使用限定符的主要方式。它可以與@Autowired和@Inject協同使用,在注入的時候指定想到注入進去的是哪個bean
如圖所示
爲限定符@Qualifier註解所設置的參數就是想要注入的bean的ID。所有使用@Component註解聲明的類都會創建爲bean,並且Bean的ID的首字母變爲小寫的類名。
但是會存在一些問題,如下圖所示
2.bean的作用域
在默認情況下,Spring應用上下文所有的Bean都是作爲以單例的形式創建的。
Spring中定義了多種作用域,可以基於這種作用域創建bean
包括:
- 單例——在整個應用中只創建一個bean
- 原型——每次注入或者通過Spring應用上下文獲取的時候,都會創建一個新的bean的實例。
- 會話——在web應用中,爲每個會話創建一個實例
- 請求——在web應用中,爲每個請求創建一個bean的實例。
如果你是用組件掃描發現和聲明Bean,那麼你可以在Bean的類上使用@Scope註解將其聲明爲原型bean,如下圖所示