第六階段ssh三大框架spring2.5-annotation_第1頁
第六階段ssh三大框架spring2.5-annotation_第2頁
第六階段ssh三大框架spring2.5-annotation_第3頁
第六階段ssh三大框架spring2.5-annotation_第4頁
第六階段ssh三大框架spring2.5-annotation_第5頁
已閱讀5頁,還剩13頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、概述注釋配置相對(duì)于 XML 配置具有很多的優(yōu)勢(shì):它可以充分利用 Java 的反射機(jī)制獲取類結(jié)構(gòu)信息,這些信息可以有效減少配置的工作。如使用 JPA 注釋配置 ORM時(shí),就不需要指定 PO 的屬性名、類型等信息,如果關(guān)系表字段和 PO 屬性名、類型都一致,您甚至無需編寫任務(wù)屬性Java 反射機(jī)制獲取。信息因?yàn)檫@些信息都可以通過注釋和 Java 代碼位于一個(gè)文件中,而 XML 配置采用獨(dú)立的配置文件,大多數(shù)配置信息在程序開發(fā)完成后都不會(huì)調(diào)整,如果配置信息和 Java 代碼放在一起,有助于增強(qiáng)程序的內(nèi)聚性。而采用獨(dú)立的 XML 配置文件,程序員在編寫一個(gè)功能時(shí),往往需要在程序文件和配置文件中不停切換

2、,這種思維上的不連貫會(huì)降低開發(fā)效率。因此在很多情況下,注釋配置比 XML 配置更受歡迎,注釋配置有進(jìn)一步流行的趨勢(shì)。Spring 2.5 的一大增強(qiáng)就是引入了很多注釋類,現(xiàn)在您已經(jīng)可以使用注釋配置完成大部分 XML 配置的功能。在這篇文章里,進(jìn)行 Bean 定義和依賴注入的內(nèi)容。向您講述使用注釋原來是怎么做的在使用注釋配置之前,先來回顧一下傳統(tǒng)上是如何配置 Bean 并完成間依賴關(guān)系的建立。下面是 3 個(gè)類,它們分別是 Office、Car 和 個(gè)類需要在 Spring 容器中配置為 Bean:Bean 之s,這 3Office 僅有一個(gè)屬性:1. Office.javapackage com

3、.baobaotao; public class Office private String officeNo =”001”;/省略 get/setterOverridepublic String toString() return officeNo: + officeNo;Car 擁有兩個(gè)屬性:2. Car.javapackage com.baobaotao;public class Car private privateString brand; double price;/ 省略get/setterOverridepublic String toString() return brand

4、: + brand + , + price:+price;s 擁有 Office 和 Car 類型的兩個(gè)屬性:3.s.javapackage com.baobaotao;public classprivate privates Car car; Office office;/ 省略get/setterOverridepublic String toString() return car: + car + n + office:+office;在 Spring 容器中將 Office 和 Car為 Bean,并注入到s Bean中:下面是使用傳統(tǒng) XML 完成這個(gè)工作的配置文件 beans.xm

5、l:4. beans.xml 將以上三個(gè)類配置成 Bean當(dāng)運(yùn)行以下代碼時(shí),控制臺(tái)將正確打出s 的信息:5.測(cè)試類:AnnoIoCTest.javaimport import public.springframework.context.ApplicationContext;.springframework.context.support.ClassPathXmlApplicationContext; class AnnoIoCTest public sic void main(String args) String locations = beans.xml; ApplicationCont

6、ext ctx =news = (ClassPathXmlApplicationContext(locations);ss) ctx.getBean(s);System.out.prln(s);這說明 Spring 容器已經(jīng)正確完成了 Bean 創(chuàng)建和裝配的工作。使用 Autowired 注釋Spring 2.5 引入了 Autowired 注釋,它可以對(duì)類成員變量、方法及構(gòu)造函數(shù)進(jìn)行標(biāo)注,完成自動(dòng)裝配的工作。來看一下使用動(dòng)注入的代碼:Autowired 進(jìn)行成員變量自6.使用 Autowired 注釋的s.javapackage importcom.baobaotao;ion.Autowir

7、ed;public classs Autowired private Car car;Autowiredprivate Office office;Spring 通過一個(gè) BeantProsor 對(duì) Autowired Spring 容器中進(jìn)行,所以要讓Autowired 起作用必須事先在AutowiredAnnoionBeantProsorBean。7. 讓 Autowired 注釋工作起來!- 該 Bean!- 移除s class=com.baobaotao.s/.springframework.beans.factory.anno這樣,當(dāng) Spring 容器啟動(dòng)時(shí),AutowiredAn

8、noionBeantProsor 將掃描 Spring 容器中所有 Bean,當(dāng)發(fā)現(xiàn) Bean 中擁有 Autowired 注釋時(shí)就找到和其匹配(默認(rèn)按類型匹配)的 Bean,并注入到對(duì)應(yīng)的地方中去。按照上面的配置,Spring 將直接采用 Java 反射機(jī)制對(duì)s 中的 car 和office 這兩個(gè)私有成員變量進(jìn)行自動(dòng)注入。所以對(duì)成員變量使用 Autowired后,您大可將它們的 setter 方法(setCar() 和 setOffice())從除。s 中刪當(dāng)然,您也可以通過 Autowired 對(duì)方法或構(gòu)造函數(shù)進(jìn)行標(biāo)注,來看下面的代碼:8. 將 Autowired 注釋標(biāo)注在 Sette

9、r 方法上package com.baobaotao;public classs private Car car; private Office office;Autowiredpublic void setCar(Car car) this.car = car;Autowiredpublic void setOffice(Office office) this.office = office;這時(shí),Autowired 將查找被標(biāo)注的方法的入?yún)㈩愋偷腂ean,并調(diào)用方法自動(dòng)注入這些 Bean。而下面的使用方法則對(duì)構(gòu)造函數(shù)進(jìn)行標(biāo)注:9. 將 Autowired 注釋標(biāo)注在構(gòu)造函數(shù)上package

10、 com.baobaotao;public classs private Car car; private Office office;Autowiredpublics(Car car ,Office office)this.car = car; this.office = office ;由于s() 構(gòu)造函數(shù)有兩個(gè)入?yún)?,分別是 car和 office,Autowired 將分s(Car car ,Office office) 的別尋找和它們類型匹配的 Bean,將它們作為入?yún)韯?chuàng)建s Bean。當(dāng)候選 Bean 數(shù)目不為 1 時(shí)的應(yīng)對(duì)方法在默認(rèn)情況下使用 Autowired 注釋進(jìn)行自動(dòng)注入

11、時(shí),Spring 容器中匹配的候選 Bean 數(shù)目必須有且僅有一個(gè)。當(dāng)找不到一個(gè)匹配的 Bean 時(shí),Spring 容器將拋出 BeanCreationException 異常,并可以來做一個(gè)實(shí)驗(yàn):必須至少擁有一個(gè)匹配的 Bean。10. 候選 Bean 數(shù)目為 0 時(shí)!- -由于 office Bean 被注釋掉了,所以 Spring 容器中將沒有類型為 Office 的Bean 了,而s 的 office 屬性標(biāo)注了 Autowired,當(dāng)啟動(dòng) Spring 容器時(shí),異常就產(chǎn)生了。當(dāng)不能確定 Spring 容器中一定擁有某個(gè)類的 Bean 時(shí),可以在需要自動(dòng)注入該類 Bean 的地方可以使

12、用 Autowired(required = false),這等于告訴 Spring:在找不到匹配 Bean 時(shí)也不報(bào)錯(cuò)。來看一下具體的例子:11. 使用 Autowired(required = false)packagecom.baobaotao;import import.springframework.beans.factory.anno.springframework.beans.factory.annoion.Autowired; ion.Required;publicclasss private Car car; private Office office;Autowiredpu

13、blic void setCar(Car car) this.car = car;Autowired(required = false)public void setOffice(Office office) this.office = office;當(dāng)然,一般情況下,使用 Autowired 的地方都是需要注入 Bean 的,使用了自動(dòng)注入而又允許不注入的情況一般僅會(huì)在開發(fā)期或測(cè)試期碰到(如為了快速啟動(dòng) Spring 容器,僅引入一些模塊的 Spring 配置文件),所以 Autowired(required = false) 會(huì)很少用到。和找不到一個(gè)類型匹配 Bean 相反的一個(gè)錯(cuò)誤是:如

14、果 Spring 容器中擁有多個(gè)候選 Bean,Spring 容器在啟動(dòng)時(shí)也會(huì)拋出 BeanCreationException 異常。來看下面的例子:12. 在 beans.xml 中配置兩個(gè) Office 類型的 Bean在 Spring 容器中配置了兩個(gè)類型為 Office 類型的 Bean,當(dāng)對(duì)s 的office 成員變量進(jìn)行自動(dòng)注入時(shí),Spring 容器將無法確定到底要用哪一個(gè)Bean,因此異常發(fā)生了。Spring 允許通過 Qualifier 注釋指定注入 Bean 的名稱,這樣歧義就消除了,可以通過下面的方法解決異常:13. 使用 Qualifier 注釋指定注入 Bean 的名稱

15、Autowiredpublic void setOffice(Qualifier(office)Office office) this.office = office;Qualifier(office) 中的 office 是 Bean 的名稱,所以 Autowired 和 Qualifier 結(jié)合使用時(shí),自動(dòng)注入的策略就從 byType 轉(zhuǎn)變成 byName 了。 Autowired 可以對(duì)成員變量、方法以及構(gòu)造函數(shù)進(jìn)行注釋,而 Qualifier 的標(biāo)注對(duì)象是成員變量、方法入?yún)?、?gòu)造函數(shù)入?yún)?。正是由于注釋?duì)象的不同,所以 Spring 不將 Autowired 和 Qualifier成員變

16、量和構(gòu)造函數(shù)入?yún)⑦M(jìn)行注釋的代碼:成一個(gè)注釋類。下面是對(duì)對(duì)成員變量進(jìn)行注釋:14. 對(duì)成員變量使用 Qualifier 注釋public classs Autowired private Car car;Autowired Qualifier(office) private Office office;對(duì)構(gòu)造函數(shù)入?yún)⑦M(jìn)行注釋:15. 對(duì)構(gòu)造函數(shù)變量使用Qualifier 注釋public classs private Car car; private Office office;Autowiredpublics(Car car , Qualifier(office)Officeoffice)th

17、is.car = car; this.office = office ;Qualifier 只能和 Autowired 結(jié)合使用,是對(duì) Autowired 有益的補(bǔ)充。一般來講,Qualifier 對(duì)方法簽名中入?yún)⑦M(jìn)行注釋會(huì)降低代碼的可讀性,而對(duì)成員變量注釋則相對(duì)好一些。使用 JSR-250 的注釋Spring 不但支持自己定義的 Autowired 的注釋,還支持幾個(gè)由 JSR-250 規(guī)范定義的注釋,它們分別是 Resource、tConstruct 以及 PreDestroy。ResourceResource 的作用相當(dāng)于 Autowired,只不過 Autowired 按 byType

18、 自動(dòng)注入,面 Resource 默認(rèn)按 byName 自動(dòng)注入罷了。Resource 有兩個(gè)屬性是比較重要的,分別是 name 和 type,Spring 將 Resource 注釋的 name 屬性解析為 Bean 的名字,而 type 屬性則為 Bean 的類型。所以如果使用 name屬性,則使用 byName 的自動(dòng)注入策略,而使用 type 屬性時(shí)則使用 byType 自動(dòng)注入策略。如果既不指定 name 也不指定 type 屬性,這時(shí)將通過反射機(jī)制使用 byName 自動(dòng)注入策略。Resource 注釋類位于 Spring 發(fā)布包的mon-annoions.jar類包中,因此在使用

19、之前必須將其加入到項(xiàng)目的類庫中。來看一個(gè)使用Resource 的例子:16. 使用 Resource 注釋的s.javapackage com.baobaotao;importjavax.annoion.Resource;public/classs 自動(dòng)注入類型為 Car 的 BeanResource private Car car;/ 自動(dòng)注入 bean 名稱為 office 的 Bean Resource(name = office)private Office office;一般情況下,無需使用類似于 Resource(type=Car.class)的注釋方式,因?yàn)?Bean 的類型信息

20、可以通過 Java 反射從代碼中獲取。要讓 JSR-250 的注釋生效,除了在 Bean 類中標(biāo)注這些注釋外,還需要在Spring 容器中一個(gè)負(fù)責(zé)處理這些注釋的 BeantProsor:CommonAnnoionBeantProsor 實(shí)現(xiàn)了 BeantProsor 接口,它負(fù)責(zé)掃描使用了 JSR-250 注釋的 Bean,并對(duì)它們進(jìn)行相應(yīng)的操作。tConstruct 和 PreDestroySpring 容器中的 Bean 是有生命周期的,Spring 允許在 Bean 在初始化完成后以及 Bean 銷毀前執(zhí)行特定的操作,您既可以通過實(shí)現(xiàn)InitializingBean/Disabean 接

21、口來定制初始化之后 / 銷毀之前的操作方法,也可以通過 元素的 init-method/destroy-method 屬性指定初始化之后 / 銷毀之前調(diào)用的操作方法。關(guān)于 Spring 的生命周期,筆者在精通 Spring 2.x企業(yè)應(yīng)用開發(fā)精解第 3 章進(jìn)行了詳細(xì)的描述,有的讀者可以查閱。JSR-250 為初始化之后/銷毀之前方法的指定定義了兩個(gè)注釋類,分別是 tConstruct 和 PreDestroy,這兩個(gè)注釋只能應(yīng)用于方法上。標(biāo)注了tConstruct 注釋的方法將在類實(shí)例化后調(diào)用,而標(biāo)注了PreDestroy的方法將在類銷毀之前調(diào)用。17. 使用 tConstruct 和 Pre

22、Destroy 注釋的s.javapackage com.baobaotao;import import importjavax.anno javax.anno javax.annoion.Resource;ion.tConstruct;ion.PreDestroy;publicclasssResource private Car car;Resource(name private Office= office) office;tConstructpublic voidtConstruct1()System.out.prln(tConstruct1);PreDestroypublic void

23、 preDestroy1()System.out.prln(preDestroy1);您只需要在方法前標(biāo)注 tConstruct 或 PreDestroy,這些方法就會(huì)在Bean 初始化后或銷毀之前被 Spring 容器執(zhí)行了。知道,不管是通過實(shí)現(xiàn) InitializingBean/Disabean 接口,還是通過 元素的 init-method/destroy-method 屬性進(jìn)行配置,都只能為Bean 指定一個(gè)初始化 / 銷毀的方法。但是使用 tConstruct 和PreDestroy 注釋卻可以指定多個(gè)初始化 / 銷毀方法,那些被標(biāo)注tConstruct 或 PreDestroy 注

24、釋的方法都會(huì)在初始化 / 銷毀時(shí)被執(zhí)行。通過以下的測(cè)試代碼,您將可以看到 Bean 的初始化 / 銷毀方法是如何被執(zhí)行的:18. 測(cè)試類代碼package com.baobaotao;import.springframework.context.support.ClassPathXmlApplicationContext;public class AnnoIoCTest public sic void main(String args) String locations = beans.xml; ClassPathXmlApplicationContext ctx =new ClassPath

25、XmlApplicationContext(locations);ss = (s) ctx.getBean( ln(s);s);System.out.prctx.destroy();/關(guān)閉 Spring 容器,以觸發(fā) Bean 銷毀方法的執(zhí)行這時(shí),您將看到標(biāo)注了 Spring 容器啟動(dòng)時(shí),創(chuàng)建tConstruct 的tConstruct1() 方法將在s Bean 的時(shí)候被觸發(fā)執(zhí)行,而標(biāo)注了PreDestroy 注釋的 preDestroy1() 方法將在 Spring 容器關(guān)閉前銷毀Bean 的時(shí)候被觸發(fā)執(zhí)行。s使用 簡化配置Spring 2.1 添加了一個(gè)新的 context 的 Sche

26、ma 命名空間,該命名空間對(duì)注釋驅(qū)動(dòng)、屬性文件引入、加載期織入等功能提供了便捷的配置。本身是不會(huì)做任何事情的,它僅提供元數(shù)據(jù)信息。要使元數(shù)據(jù) 必須讓負(fù)責(zé)處理這些元數(shù)據(jù)的處理器工作起來。知道注釋 正起作用,而前面所介紹的 AutowiredAnnoionBeantProsor 和CommonAnnoionBeantProsor 就是處理這些注釋元數(shù)據(jù)的處理器。但是直接在 Spring配置文件中定義這些 Bean 顯得比較笨拙。Spring為提供了便的這些 BeantProsor 的方式,這就是。請(qǐng)看下面的配置:19. 調(diào)整 beans.xml 配置文件 將隱式地向 Spring 容器Autowi

27、redAnnoionBeantProsor、CommonAnnoionBeantProsor、PersistenceAnnoionBeantProsor 以及equiredAnnoionBeantProsor 這 4 個(gè) BeantProsor。在配置文件中使用 context 命名空間之前,必須在 元素中context 命名空間。使用 Component雖然可以通過 Autowired 或 Resource 在 Bean 類中使用自動(dòng)注入功能,但是 Bean 還是在 XML 文件中通過 進(jìn)行定義 也就是說,在XML 配置文件中定義 Bean,通過 Autowired 或 Resource 為

28、 Bean 的成員變量、方法入?yún)⒒驑?gòu)造函數(shù)入?yún)⑻峁┳詣?dòng)注入的功能。能否也通過注釋定義Bean,從 XML 配置文件中完全移除 Bean 定義的配置呢?是肯定的,通過 Spring 2.5 提供的 Component 注釋就可以達(dá)到這個(gè)目標(biāo)了。下面,完全使用注釋定義 Bean并完成 Bean 之間裝配:20. 使用 Component 注釋的Car.javapackage com.baobaotao;import.springframewponent;Componentpublic class Car 僅需要在類定義處,使用 Component 注釋就可以將一個(gè)類定義了器中的 Bean。下面的代

29、碼將 Office 定義為一個(gè) Bean:Spring容21. 使用 Component 注釋的 Office.javapackage com.baobaotao;import.springframewponent;Componentpublic class Office private String officeNo = 001;這樣,就可以在Office Bean 了。s 類中通過 Autowired 注入前面定義的Car 和22. 使用 Component 注釋的s.javapackage com.baobaotao;import.springframework.beans.factor

30、y.annoion.Autowired;import import import.springframework.beans.factory.anno.springframework.beans.factory.annoion.Required; ion.Qualifier;.springframewponent;Component(s)public classAutowireds private Car car;Autowiredprivate Office office;Component 有一個(gè)可選的入?yún)?,用于指?Bean 的名稱,在s 中,就將 Bean 名稱定義為“s”。一般情況下

31、,Bean 都是 singleton 的,需要注入 Bean 的地方僅需要通過 byType 策略就可以自動(dòng)注入了,所以大可不必指定 Bean 的名稱。在使用 Component 注釋后,Spring 容器必須啟用類掃描機(jī)制以啟用注釋驅(qū)動(dòng)Bean 定義和注釋驅(qū)動(dòng) Bean 自動(dòng)注入的策略。Spring2.5對(duì)context 命名空間進(jìn)行了擴(kuò)展,提供了這能,請(qǐng)看下面的配置:23. 簡化版的 beans.xmlponent-scanbase-package=com.baobaotao/這里,所有通過一行 元素定義 Bean 的配置內(nèi)容已經(jīng)被移除,僅需要添加ponent-scan/ 配置就解決所有問

32、題了Spring XML 配置文件得到了極致的簡化(當(dāng)然配置元數(shù)據(jù)還是需要的,只不過以注釋形式存在罷了)。 的 base-package 屬性指定了需要掃描的類包,類包及其遞歸子包中所有的類都會(huì)被處理。 還允許定義過濾器將基包下的某些類納入或排除。Spring 支持以下 4 種類型的過濾方式,通過下表說明:表 1. 掃描過濾方式過濾器類型說明假如 com.baobaotao.SomeAnno將使用該注釋的類過濾出來。ion 是一個(gè)注釋類可以注釋通過全限定類名進(jìn)行過濾,如您可以指定將類名指定com.baobaotao.在外。s 納入掃描,而將 com.baobaotao.Car排除通過正則表達(dá)式

33、定義過濾的類,如下所示:com.baobaotao.Default.*通過 AspectJ 表達(dá)式定義過濾的類,如下所示: com. baobaotao.*Service+正則表達(dá)式AspectJ 表達(dá)式下面是一個(gè)簡單的例子:值得注意的是 配置項(xiàng)不但啟用了對(duì)類包進(jìn)行掃定義的功能,同時(shí)還啟用了注釋驅(qū)動(dòng)自動(dòng)注入的功能Bean了 AutowiredAnnoionBeantProsor 和CommonAnno 后,就可以將 默認(rèn)情況下通過 Component 定義的 Bean 都是 singleton 的,如果需要使用其它作用范圍的 Bean,可以通過 Scope 注釋來達(dá)到目標(biāo),如以下代碼所示:24. 通過 Scope 指定 Bean 的作用范圍package com.baobaotao;import.springframework.context.annoion.Scope;Scope(prototype)Component( publi

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論