<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
自動裝配說明
Spring中bean有三種裝配機制,分別是:
這裡我們主要講第三種:自動化的裝配bean。
Spring的自動裝配需要從兩個角度來實現,或者說是兩個操作:
元件掃描和自動裝配組合發揮巨大威力,使得顯示的設定降低到最少。
推薦不使用自動裝配xml設定 , 而使用註解 .
測試環境搭建
1、新建一個專案
2、新建兩個實體類,Cat Dog 都有一個叫的方法
public class Cat { public void shout(){ System.out.println("喵喵叫..."); } } public class Dog { public void shout() { System.out.println("汪汪叫..."); } }
3、新建一個使用者類 User
public class People { @Resource private Cat cat; //如果顯示的定義了Autowired的required為false // @Autowired(required = false) // @Qualifier(value = "dog222") @Resource private Dog dog; private String name; public String getName() { return name; } public void setName(@Nullable String name) { this.name = 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; } @Override public String toString() { return "People{" + "cat=" + cat + ", dog=" + dog + ", name='" + name + ''' + '}'; } }
4、編寫Spring組態檔
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans-3.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd"> <!-- http://www.springframework.org/schema/aop--> <!-- http://www.springframework.org/schema/context/spring-aop-3.0.xsd">--> <context:annotation-config/> <bean id="cat" class="com.hc.pojo.Cat"/> <bean id="dog222" class="com.hc.pojo.Dog"/> <!-- <bean id="dog111" class="com.hc.pojo.Dog"/>--> <!-- //byName自動裝配--> <!--<bean id="people" class="com.hc.pojo.People" autowire="byName">--> <bean id="people" class="com.hc.pojo.People" > <!-- <property name="name" value="小狂神呀"/>--> <!-- <property name="dog" value="dog"/>--> <!-- <property name="cat" value="cat"/>--> </bean> </beans>
5、測試
public class MyTest { @Test public void test1() { ApplicationContext context = new ClassPathXmlApplicationContext("beans.xml"); People people = context.getBean("people", People.class); people.getDog().shout(); people.getCat().shout(); } }
結果正常輸出,環境OK
byName
autowire byName (按名稱自動裝配)
由於在手動設定xml過程中,常常發生字母缺漏和大小寫等錯誤,而無法對其進行檢查,使得開發效率降低。
採用自動裝配將避免這些錯誤,並且使設定簡單化。
測試:
1、修改bean設定,增加一個屬性 autowire=“byName”
<!--<bean id="people" class="com.hc.pojo.People" autowire="byName">--> <!-- <property name="name" value="小狂神呀"/>--> <!-- <property name="dog" value="dog"/>--> <!-- <property name="cat" value="cat"/>--> </bean>
2、再次測試,結果依舊成功輸出!
3、我們將 cat 的bean id修改為 catXXX
4、再次測試, 執行時報空指標java.lang.NullPointerException。因為按byName規則找不對應set方法,真正的setCat就沒執行,物件就沒有初始化,所以呼叫時就會報空指標錯誤。
小結:
當一個bean節點帶有 autowire byName的屬性時。
byType
autowire byType (按型別自動裝配)
使用autowire byType首先需要保證:同一型別的物件,在spring容器中唯一。如果不唯一,會報不唯一的異常。
NoUniqueBeanDefinitionException
測試:
1、將user的bean設定修改一下 : autowire=“byType”
2、測試,正常輸出
3、在註冊一個cat 的bean物件!
<bean id="dog" class="com.kuang.pojo.Dog"/> <bean id="cat" class="com.kuang.pojo.Cat"/> <bean id="cat2" class="com.kuang.pojo.Cat"/> <bean id="user" class="com.kuang.pojo.User" autowire="byType"> <property name="str" value="qinjiang"/> </bean>
4、測試
報錯:NoUniqueBeanDefinitionException
5、刪掉cat2,將cat的bean名稱改掉!測試!因為是按型別裝配,所以並不會報異常,也不影響最後的結果。甚至將id屬性去掉,也不影響結果。
這就是按照型別自動裝配!
使用註解
jdk1.5開始支援註解,spring2.5開始全面支援註解。
準備工作:利用註解的方式注入屬性。
1、在spring組態檔中引入context檔案頭
xmlns:context="http://www.springframework.org/schema/context"
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd"
2、開啟屬性註解支援!
<context:annotation-config/>
@Autowired
測試:
1、將User類中的set方法去掉,使用@Autowired註解
public class User { @Autowired private Cat cat; @Autowired private Dog dog; private String str; public Cat getCat() { return cat; } public Dog getDog() { return dog; } public String getStr() { return str; } }
2、此時組態檔內容
<context:annotation-config/> <bean id="dog" class="com.kuang.pojo.Dog"/> <bean id="cat" class="com.kuang.pojo.Cat"/> <bean id="user" class="com.kuang.pojo.User"/>
3、測試,成功輸出結果!
@Autowired(required=false) 說明:false,物件可以為null;true,物件必須存物件,不能為null。
//如果允許物件為null,設定required = false,預設為true @Autowired(required = false) private Cat cat; 123
@Qualifier
測試實驗步驟:
1、組態檔修改內容,保證型別存在物件。且名字不為類的預設名字!
<context:annotation-config/> <bean id="cat" class="com.hc.pojo.Cat"/> <bean id="dog222" class="com.hc.pojo.Dog"/> <!-- <bean id="dog111" class="com.hc.pojo.Dog"/>-->
2、沒有加Qualifier測試,直接報錯
3、在屬性上新增Qualifier註解
@Autowired @Qualifier(value = "cat2") private Cat cat; @Autowired @Qualifier(value = "dog2") private Dog dog; 123456
測試,成功輸出!
@Resource
實體類:
public class People { @Resource private Cat cat; //如果顯示的定義了Autowired的required為false // @Autowired(required = false) // @Qualifier(value = "dog222") @Resource private Dog dog; private String name;
beans.xml
<bean id="cat" class="com.hc.pojo.Cat"/> <bean id="dog222" class="com.hc.pojo.Dog"/> <!-- <bean id="dog111" class="com.hc.pojo.Dog"/>-->
測試:結果OK
組態檔2:beans.xml , 刪掉cat2
<bean id="cat" class="com.hc.pojo.Cat"/> <bean id="dog222" class="com.hc.pojo.Dog"/>
實體類上只保留註解
@Resource private Cat cat; @Resource private Dog dog; 1234
結果:OK
結論:先進行byName查詢,失敗;再進行byType查詢,成功。
小結
@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 Bean自動裝配內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45