javascript
(Spring)自动装配bean
文章目錄
- 自動裝配bean
- 1. 環境搭建
- 2. byName自動裝配
- 3. byType自動裝配
- 4. 使用注解自動裝配
- 4.1 @Autowired和@Qualifier
- 4.2 @Resource
- 4.3 總結
自動裝配bean
自動裝配說明
-
自動裝配是使用spring滿足bean依賴的一種方法
-
spring會在應用上下文中為某個bean尋找其依賴的bean。
Spring的自動裝配需要從兩個角度來實現,或者說是兩個操作:
-
組件掃描(component scanning):spring會自動發現應用上下文中所創建的bean;
-
自動裝配(autowiring):spring自動滿足bean之間的依賴,也就是我們說的IoC/DI;
組件掃描和自動裝配組合發揮巨大威力,使得顯示的配置降低到最少。
1. 環境搭建
public class Cat {public void shout(){System.out.println("喵(>^ω^<)~");} } public class Dog {public void shout(){System.out.println("汪!");} } public class People {private Cat cat;private Dog dog;private String name;public Cat getCat() {return cat;}public void setCat(Cat cat) {this.cat = cat;}public Dog getDog() {return dog;}public void setDog(Dog dog) {this.dog = dog;}public String getName() {return name;}public void setName(String name) {this.name = name;}@Overridepublic String toString() {return "People{" +"cat=" + cat +", dog=" + dog +", name='" + name + '\'' +'}';} }測試
bean
2. byName自動裝配
由于在手動配置xml過程中,常常發生字母缺漏和大小寫等錯誤,而無法對其進行檢查,使得開發效率降低。
采用自動裝配將避免這些錯誤,并且使配置簡單化。
修改bean配置,增加一個屬性 autowire=“byName”
<bean id="people" class="com.zh.pojo.People" autowire="byName"><property name="name" value="伊澤瑞爾"/></bean>測試依然成功
將 cat 的bean id修改為 catXXX 則出現空指針異常
注意!
使用byName實現自動裝配,對象名必須與beanid相同。
3. byType自動裝配
<bean id="dog" class="com.zh.pojo.Dog"/><bean id="cat" class="com.zh.pojo.Cat"/><bean id="people" class="com.zh.pojo.People" autowire="byType"><property name="name" value="伊澤瑞爾"/></bean>注意!
使用autowire byType首先需要保證:同一類型的對象,在spring容器中唯一。如果不唯一,會報不唯一的異常。
4. 使用注解自動裝配
準備工作
在spring配置文件中引入context文件頭,以及開啟注解支持
4.1 @Autowired和@Qualifier
@Autowired
-
@Autowired是按類型自動轉配的,不支持id匹配。
-
需要導入 spring-aop的包!
@Qualifier
-
@Autowired是根據類型自動裝配的,加上@Qualifier則可以根據byName的方式自動裝配
-
@Qualifier不能單獨使用。
這兩個注解可以配合使用,但一般開發情況下只需要@Autowired注解即可
測試:
public class People {@Autowired@Qualifier(value = "cat2")private Cat cat;@Autowiredprivate Dog dog;private String name;public Cat getCat() {return cat;}public Dog getDog() {return dog;}public String getName() {return name;}@Overridepublic String toString() {return "People{" +"cat=" + cat +", dog=" + dog +", name='" + name + '\'' +'}';} }使用@Autowired注解時,由于是運用反射機制,所以可以不用寫set方法。
輸出
4.2 @Resource
-
@Resource如有指定的name屬性,先按該屬性進行byName方式查找裝配;
-
其次再進行默認的byName方式進行裝配;
-
如果以上都不成功,則按byType的方式自動裝配。
-
都不成功,則報異常。
實體類
public class User {//如果允許對象為null,設置required = false,默認為true@Resource(name = "cat2")private Cat cat;@Resourceprivate Dog dog;private String str; }beans.xml
<bean id="dog" class="com.kuang.pojo.Dog"/> <bean id="cat1" class="com.kuang.pojo.Cat"/> <bean id="cat2" class="com.kuang.pojo.Cat"/>4.3 總結
@Autowired與@Resource異同:
1、@Autowired與@Resource都可以用來裝配bean。都可以寫在字段上,或寫在setter方法上。
2、@Autowired默認按類型裝配(屬于spring規范),默認情況下必須要求依賴對象必須存在,如果要允許null 值,可以設置它的required屬性為false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier注解進行使用
3、@Resource(屬于J2EE復返),默認按照名稱進行裝配,名稱可以通過name屬性進行指定。如果沒有指定name屬性,當注解寫在字段上時,默認取字段名進行按照名稱查找,如果注解寫在setter方法上默認取屬性名進行裝配。當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。
它們的作用相同都是用注解方式注入對象,但執行順序不同。@Autowired先byType,@Resource先byName。
總結
以上是生活随笔為你收集整理的(Spring)自动装配bean的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (Spring)依赖注入
- 下一篇: (Spring)使用注解开发