天天看點

Spring AOP注解通過@Autowired,@Resource,@Qualifier,@PostConstruct,@PreDestroy注入屬性的配置檔案詳解

原創整理不易,轉載請注明出處:

代碼下載下傳位址:

本文介紹了使用spring注解注入屬性的方法。使用注解以前,注入屬性通過類以及配置檔案來實作。現在,注入屬性可以通過引入@autowired注解,或者@resource,@qualifier,@postconstruct,@predestroy等注解來實作。

1.1. 使用注解以前我們是怎樣注入屬性的

類的實作:

配置檔案:

1.2. 引入@autowired注解(不推薦使用,建議使用@resource)

類的實作(對成員變量進行标注)

或者(對方法進行标注)

配置檔案

@autowired可以對成員變量、方法和構造函數進行标注,來完成自動裝配的工作。以上兩種不同實作方式中,@autowired的标注位置不同,它們都會在spring在初始化usermanagerimpl這個bean時,自動裝配userdao這個屬性,差別是:第一種實作中,spring會直接将userdao類型的唯一一個bean指派給userdao這個成員變量;第二種實作中,spring會調用 setuserdao方法來将userdao類型的唯一一個bean裝配到userdao這個屬性。

1.3. 讓@autowired工作起來

要使@autowired能夠工作,還需要在配置檔案中加入以下代碼

1.4. @qualifier

@autowired是根據類型進行自動裝配的。在上面的例子中,如果當spring上下文中存在不止一個userdao類型的bean時,就會抛出beancreationexception異常;如果spring上下文中不存在userdao類型的bean,也會抛出 beancreationexception異常。我們可以使用@qualifier配合@autowired來解決這些問題。

a. 可能存在多個userdao執行個體

這樣,spring會找到id為userdao的bean進行裝配。

b. 可能不存在userdao執行個體

1.5. @resource(jsr-250标準注解,推薦使用它來代替spring專有的@autowired注解)

spring 不但支援自己定義的@autowired注解,還支援幾個由jsr-250規範定義的注解,它們分别是@resource、@postconstruct以及@predestroy。

@resource的作用相當于@autowired,隻不過@autowired按bytype自動注入,而@resource預設按 byname自動注入罷了。@resource有兩個屬性是比較重要的,分别是name和type,spring将@resource注解的name屬性解析為bean的名字,而type屬性則解析為bean的類型。是以如果使用name屬性,則使用byname的自動注入政策,而使用type屬性時則使用bytype自動注入政策。如果既不指定name也不指定type屬性,這時将通過反射機制使用byname自動注入政策。

@resource裝配順序

1. 如果同時指定了name和type,則從spring上下文中找到唯一比對的bean進行裝配,找不到則抛出異常

2. 如果指定了name,則從上下文中查找名稱(id)比對的bean進行裝配,找不到則抛出異常

3. 如果指定了type,則從上下文中找到類型比對的唯一bean進行裝配,找不到或者找到多個,都會抛出異常

4. 如果既沒有指定name,又沒有指定type,則自動按照byname方式進行裝配(見2);如果沒有比對,則回退為一個原始類型(userdao)進行比對,如果比對則自動裝配;

1.6. @postconstruct(jsr-250)

在方法上加上注解@postconstruct,這個方法就會在bean初始化之後被spring容器執行(注:bean初始化包括,執行個體化bean,并裝配bean的屬性(依賴注入))。

它的一個典型的應用場景是,當你需要往bean裡注入一個其父類中定義的屬性,而你又無法複寫父類的屬性或屬性的setter方法時,如:

這裡通過@postconstruct,為userdaoimpl的父類裡定義的一個sessionfactory私有屬性,注入了我們自己定義的sessionfactory(父類的setsessionfactory方法為final,不可複寫),之後我們就可以通過調用 super.getsessionfactory()來通路該屬性了。

1.7. @predestroy(jsr-250)

在方法上加上注解@predestroy,這個方法就會在bean初始化之後被spring容器執行。由于我們目前還沒有需要用到它的場景,這裡不不去示範。其用法同@postconstruct。

1.8. 使用< context:annotation-config />簡化配置

spring2.1添加了一個新的context的schema命名空間,該命名空間對注釋驅動、屬性檔案引入、加載期織入等功能提供了便捷的配置。我們知道注釋本身是不會做任何事情的,它僅提供中繼資料資訊。要使中繼資料資訊真正起作用,必須讓負責處理這些中繼資料的處理器工作起來。

autowiredannotationbeanpostprocessor和 commonannotationbeanpostprocessor就是處理這些注釋中繼資料的處理器。但是直接在spring配置檔案中定義這些 bean顯得比較笨拙。spring為我們提供了一種友善的注冊這些beanpostprocessor的方式,這就是< context:annotation-config />:

<context:annotationconfig />将隐式地向spring容器注冊autowiredannotationbeanpostprocessor、 commonannotationbeanpostprocessor、 persistenceannotationbeanpostprocessor以及 requiredannotationbeanpostprocessor這4個beanpostprocessor。

繼續閱讀