天天看點

spring常用注解

http://blog.csdn.net/chjttony/article/details/6286144

http://blog.csdn.net/jadyer/article/details/6038604

@Repository、 @Service、 @Controller @Component@Scope("prototype")  @PostConstruct  @PreDestroy@Required

<context:annotation-config />  <context:component-scan base-package=”bookstore.dao” /> 

Spring Annotation 的簡單介紹

1.使用 @Repository、 @Service、 @Controller 和 @Component将類辨別為 Bean:

Spring 自 2.0 版本開始,陸續引入了一些注解用于簡化 Spring 的開發。 @Repository 注解便屬于最先引入的一批,它用于将資料通路層 (DAO 層 ) 的類辨別為 Spring Bean。具體隻需将該注解标注在 DAO 類上即可。同時,為了讓 Spring 能夠掃描類路徑中的類并識别出 @Repository 注解,需要在 XML 配置檔案中啟用 Bean 的自動掃描功能,這可以通過<context:component-scan/>

<context:component-scan base-package=”bookstore.dao” />   

<context:annotation-config/>

該配置隐式注冊了多個對注解進行解析的處理器,如下列

AutowiredAnnotationBeanPostProcessor      CommonAnnotationBeanPostProcessor

PersistenceAnnotationBeanPostProcessor    RequiredAnnotationBeanPostProcessor

其實,注解本身做不了任何事情,和XML一樣,隻起到配置的作用,主要在于背後強大的處理器

如此,我們就不再需要在 XML 中顯式使用 <bean/> 進行 Bean 的配置。Spring 在容器初始化時将自動掃描 base-package 指定的包及其子包下的所有 class 檔案,所有标注了 @Repository 的類都将被注冊為 Spring Bean。

Spring 2.5 在 @Repository 的基礎上增加了功能類似的額外三個注解:

* @Component、@Service、@Constroller,它們分别用于軟體系統的不同層次:

* @Component 是一個泛化的概念,僅僅表示一個元件 (Bean) ,可以作用在任何層次。

* @Service 通常作用在業務層,但是目前該功能與 @Component 相同。

* @Constroller 通常作用在控制層,但是目前該功能與 @Component 相同。

通過在類上使用 @Repository、 @Component、 @Service 和 @Constroller 注解,Spring 會自動建立相應的 BeanDefinition 對象,并注冊到 ApplicationContext 中。這些類就成了 Spring 受管元件。這三個注解除了作用于不同軟體層次的類,其使用方式與 @Repository 是完全相同的。

Spring使用注解的機制

當一個 Bean 被自動檢測到時,會根據那個掃描器的 BeanNameGenerator 政策生成它的 bean 名稱。預設情況下,對于包含 name 屬性的 @Component、 @Repository、 @Service 和 @Controller,會把name 取值作為 Bean 的名字。

如果這個注解不包含 name 值或是其他被自定義過濾器發現的元件,預設 Bean 名稱會是小寫開頭的類的簡單名稱。

與通過 XML 配置的 Spring Bean 一樣,通過上述注解辨別的 Bean,其預設作用域是"singleton",為了配合這四個注解,在标注 Bean 的同時能夠指定 Bean 的作用域,Spring 2.5 引入了 @Scope 注解。使用該注解時隻需提供作用域的名稱就行了

@Scope("prototype") 

@Repository 

public class Demo { … } 

使用 @PostConstruct 和 @PreDestroy 指定生命周期回調方法:

Spring Bean 是受 Spring IoC 容器管理,由容器進行初始化和銷毀的(prototype 類型由容器初始化之後便不受容器管理),通常我們不需要關注容器對 Bean 的初始化和銷毀操作,由 Spring 經過構造函數或者工廠方法建立的 Bean 就是已經初始化完成并立即可用的。然而在某些情況下,可能需要我們手工做一些額外的初始化或者銷毀操作,這通常是針對一些資源的擷取和釋放操作

第一種方式:

是實作 Spring 提供的兩個接口:InitializingBean 和 DisposableBean。如果希望在 Bean 初始化完成之後執行一些自定義操作,則可以讓 Bean 實作 InitializingBean 接口,該接口包含一個 afterPropertiesSet() 方法,容器在為該 Bean 設定了屬性之後,将自動調用該方法;如果 Bean 實作了 DisposableBean 接口,則容器在銷毀該 Bean 之前,将調用該接口的 destroy() 方法。這種方式的缺點是,讓 Bean

類實作 Spring 提供的接口,增加了代碼與 Spring 架構的耦合度,是以不推薦使用。

第二種方式是:

在 XML 檔案中使用 <bean> 的 init-method 和 destroy-method 屬性指定初始化之後和銷毀之前的回調方法,代碼無需實作任何接口。這兩個屬性的取值是相應 Bean 類中的初始化和銷毀方法,方法名任意,但是方法不能有參數。

 <bean id=”userService” class=”bookstore.service.UserService” 

    init-method=”init” destroy-method=”destroy”> 

    …

 </bean> 

第三種方式:

Spring 2.5 在保留以上兩種方式的基礎上,提供了對 JSR-250 的支援。JSR-250 規範定義了兩個用于指定聲明周期方法的注解: @PostConstruct 和 @PreDestroy。這兩個注解使用非常簡單,隻需分别将他們标注于初始化之後執行的回調方法或者銷毀之前執行的回調方法上。

由于使用了注解,是以需要配置相應的 Bean 後處理器,亦即在 XML 中增加如下一行:

<context:annotation-config />   

使用 @Required 進行 Bean 的依賴檢查:

依賴檢查的作用是,判斷給定 Bean 的相應 Setter 方法是否都在執行個體化的時候被調用了。而不是判斷字段是否已經存在值了。Spring 進行依賴檢查時,隻會判斷屬性是否使用了 Setter 注入。如果某個屬性沒有使用 Setter 注入,即使是通過構造函數已經為該屬性注入了值,Spring 仍然認為它沒有執行注入,進而抛出異常。另外,Spring 隻管是否通過 Setter 執行了注入,而對注入的值卻沒有任何要求,即使注入的

<null/>,Spring 也認為是執行了依賴注入。

@Required 注解隻能标注在 Setter 方法之上。因為依賴注入的本質是檢查 Setter 方法是否被調用了,而不是真的去檢查屬性是否指派了以及賦了什麼樣的值。如果将該注解标注在非 setXxxx() 類型的方法則被忽略。

為了讓 Spring 能夠處理該注解,需要激活相應的 Bean 後處理器。要激活該後處理器,隻需在 XML 中增加如下一行即可:<context:annotation-config/>   

當某個被标注了 @Required 的 Setter 方法沒有被調用,則 Spring 在解析的時候會抛出異常,以提醒開發者對相應屬性進行設定。

使用 @Resource、 @Autowired 和 @Qualifier 指定 Bean 的自動裝配政策

自動裝配是指,Spring 在裝配 Bean 的時候,根據指定的自動裝配規則,将某個Bean所需要引用類型的Bean注入進來。

<bean> 元素提供了一個指定自動裝配類型的 autowire 屬性,該屬性有如下選項:

* no -- 顯式指定不使用自動裝配。

* byName -- 如果存在一個和目前屬性名字一緻的 Bean,則使用該 Bean 進行注入。如果名稱比對但是類型不比對,則抛出異常。如果沒有比對的類型,則什麼也不做。

* byType -- 如果存在一個和目前屬性類型一緻的 Bean ( 相同類型或者子類型 ),則使用該 Bean 進行注入。byType 能夠識别工廠方法,即能夠識别 factory-method 的傳回類型。如果存在多個類型一緻的 Bean,則抛出異常。如果沒有比對的類型,則什麼也不做。

* constructor -- 與 byType 類似,隻不過它是針對構造函數注入而言的。如果目前沒有與構造函數的參數類型比對的 Bean,則抛出異常。使用該種裝配模式時,優先比對參數最多的構造函數。

* autodetect -- 根據 Bean 的自省機制決定采用 byType 還是 constructor 進行自動裝配。如果 Bean 提供了預設的構造函數,則采用 byType;否則采用 constructor 進行自動裝配。

使用 @Resource 和 @Qualifier 注解

如果希望根據 name 執行自動裝配,那麼應該使用 JSR-250 提供的 @Resource 注解

@Resource 使用 byName 的方式執行自動封裝。 @Resource 标注可以作用于帶一個參數的 Setter 方法、字段,以及帶一個參數的普通方法上。 @Resource 注解有一個 name 屬性,用于指定Bean在配置檔案中對應的名字。如果沒有指定 name 屬性,那麼預設值就是字段或者屬性的名字。

如果 @Resource 沒有指定 name 屬性,那麼使用 byName 比對失敗後,會退而使用 byType 繼續比對,如果再失敗,則抛出異常。在沒有為 @Resource 注解顯式指定 name 屬性的前提下,如果将其标注在 BeanFactory 類型、ApplicationContext 類型、ResourceLoader 類型、ApplicationEventPublisher 類型、MessageSource 類型上,那麼

Spring 會自動注入這些實作類的執行個體,不需要額外的操作。此時 name 屬性不需要指定 ( 或者指定為""),否則注入失敗;