spring可以使用 XML 配置文件中的<constructor-arg>
和<property>
元素來注入 ,也可以通過<bean>元素中的autowire來自動裝配(自動注入)
<bean id="***" class="***" autowire=""></bean>
共有下面四種情況:
1.byName:由屬性名自動裝配。Spring 容器看到在 XML 配置文件中 bean 的自動裝配的屬性設置為 byName。然后嘗試匹配,並且將它的屬性與在配置文件中被定義為相同名稱的 beans 的屬性進行連接,沒有相同名稱的什么都不做。
2.byType:由屬性數據類型自動裝配。Spring 容器看到在 XML 配置文件中 bean 的自動裝配的屬性設置為 byType。然后如果它的類型匹配配置文件中的一個確切的 bean 名稱,它將嘗試匹配和連接屬性的類型。如果存在不止一個這樣的 bean,則一個致命的異常將會被拋出,沒有相同類型的什么都不做。(如果存在多個相同類型的Bean候選項,可以通過設置其中幾個Bean為autowire-candidate="false",來設置自動裝配時忽略這幾個bean,也可以設置primary=“true”來設置當前bean作為自動裝備的值,直接忽略其他項,這個屬性不對byName有效,也就是說如果是通過byName自動裝配,依然可以找到當前Bean並自動裝配)
3.constructor:類似於 byType,但該類型適用於構造函數參數類型。如果在容器中沒有一個構造函數參數類型的 bean,則一個致命錯誤將會發生(工作過程首先根據bean的name查找(類似於byName),此時如果找到和構造參數中相同名稱的bean就注入,可以有多個相同類型的bean;否則就根據byType模式查找,此時如果有多個相同類型的bean就會報錯,可以通過設置autowire-candidate="false"或primary=“true”來避免,最后還是沒有找到就會報錯)。如果Bean的自動裝配模式為constructor,而候選bean的primary=“true”,那么將直接注入這個bean,如果候選bean同時設置為primary=“true”和autowire-candidate="false",這個bean將不會作為自動裝配候選項,不能由多個自動裝配候選項設置為primary=“true”。
4.no:默認模式,不自動裝配,需要通過<constructor-arg>
和<property>來手動注入。
<property>和<constructor-arg>將會覆蓋上面這些配置。子bean也不會繼承上面這些配置,但是內部bean將繼承外部bean的配置
也可以在<Beans>中通過default-autowire進行設置。