Spring 基於注解的配置


從 Spring 2.5 開始就可以使用注解來配置依賴注入。你可以使用相關類,方法或字段聲明的注解,將 bean 配置移動到組件類本身。

在 XML 注入之前進行注解注入,因此后者的配置將通過兩種方式的屬性連線被前者重寫。

注解連線在默認情況下在 Spring 容器中不打開。因此,在可以使用基於注解的連線之前,我們將需要在我們的 Spring 配置文件中啟用它。

他的作用是式地向 Spring 容器注冊

AutowiredAnnotationBeanPostProcessor、CommonAnnotationBeanPostProcessor、

PersistenceAnnotationBeanPostProcessor 以及 RequiredAnnotationBeanPostProcessor 這 4 個BeanPostProcessor。

注冊這4個 BeanPostProcessor的作用,就是為了你的系統能夠識別相應的注解。

例如:

如果你想使用@Autowired注解,那么就必須事先在 Spring 容器中聲明 AutowiredAnnotationBeanPostProcessor Bean。傳統聲明方式如下

<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

如果想使用@ Resource 、@ PostConstruct、@ PreDestroy等注解就必須聲明CommonAnnotationBeanPostProcessor

如果想使用@PersistenceContext注解,就必須聲明PersistenceAnnotationBeanPostProcessor的Bean。

如果想使用 @Required的注解,就必須聲明RequiredAnnotationBeanPostProcessor的Bean。同樣,傳統的聲明方式如下:

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 

一般來說,這些注解我們還是比較常用,尤其是Antowired的注解,在自動注入的時候更是經常使用,所以如果總是需要按照傳統的方式一條一條配置顯得有些繁瑣和沒有必要,於是spring給我們提供<context:annotation-config/>的簡化配置方式,自動幫你完成聲明。

   不過,我們使用注解一般都會配置掃描包路徑選項 <context:component-scan base-package=”XX.XX”/> 

    該配置項其實也包含了自動注入上述processor的功能,因此當使用 <context:component-scan/> 后,就可以將 <context:annotation-config/> 移除了

如果不填加這些配置,基於注解的配置將不起作用或只有一點作用

幾個重要注解:

1.@Required :注解應用於 bean 屬性的 setter 方法。它表明受影響的 bean 屬性在配置時必須放在 XML 配置文件中,否則容器就會拋出異常。

如果不在配置文件中啟用基於注解的配置,那么當你使用上述代碼后,而配置文件中沒有注入他,那么編譯器只會有上面的提示,啟動時不會報錯。

2.@Autowired: 注解可以應用到 bean 屬性的 setter 方法,非 setter 方法,構造函數和屬性。

setter方法的@Autowired

當 Spring遇到一個在 setter 方法中使用的 @Autowired 注釋,它執行 byType方式 自動連接,找不到會報錯(如果兩個相同類型的bean可以被注入,其中一個bean的名字和setter方法中形參一樣,則不會報錯 ,autowire="byType"方式會報錯)。

屬性中的@Autowired

當 Spring遇到一個在屬性中的 @Autowired 注釋,先通過屬性名字查找相同id或name的bean,找不到后再通過屬性類型找,找到一個就注入,找不到或找到多個就報錯,和construction方式類似。

構造函數的@Autowired

當 Spring遇到一個在屬性中的 @Autowired 注釋,先通過屬性名字查找相同id或name的bean,找不到后再通過屬性類型找,找到一個就注入,找不到或找到多個就報錯,和construction方式類似。

@Autowired的(required=false)選項

默認情況下,@Autowired 注釋意味着依賴是必須的,它類似於 @Required 注釋,然而,你可以使用 @Autowired 的 (required=false) 選項關閉默認行為,對構造函數的@Autowired無效。

3.@qualifier

當你創建多個具有相同類型的 bean 時,並且想要用一個屬性只為它們其中的一個進行裝配,在這種情況下,你可以使用 @Qualifier注釋和 @Autowired 注釋通過指定哪一個真正的 bean 將會被裝配來消除混亂。

假如你是用了@qualifier("bean1"),而由兩個bean1,bean2,其中bean2被設置為primary=“true”,那么bean1將被注入,說明@qualifier的優先級高於primary=“true”,如果bean1被設置為autowire-candidate="false",那么將會報錯,找不到bean1注入。

4.JSP-250注釋

@PostConstruct和@PreDestroy

為了定義一個 bean 的安裝和卸載,我們使用 init-method 和/或 destroy-method 參數簡單的聲明一下 。init-method 屬性指定了一個方法,該方法在 bean 的實例化階段會立即被調用。同樣地,destroy-method 指定了一個方法,該方法只在一個 bean 從容器中刪除之前被調用。

你可以使用 @PostConstruct 注釋作為初始化回調函數的一個替代,@PreDestroy 注釋作為銷毀回調函數的一個替代,繼承InitializingBean,DisposableBean 也可實現初始化和銷毀時的回調方法,其中優先級(調用的順序)@PostConstruct和@PreDestroy  >  繼承InitializingBean,DisposableBean >  init-method 和/或 destroy-method

@Resource注釋

你可以在字段中或者 setter 方法中使用 @Resource 注釋,不允許用於構造方法,它和在 Java EE 5 中的運作是一樣的。@Resource 注釋使用一個 ‘name’ 屬性,該屬性以一個 bean 名稱的形式被注入。你可以說,它遵循 by-name 自動連接語義,

如果沒有明確地指定一個 ‘name’,默認名稱源於字段名或者 setter 方法中的形參。在字段的情況下,它使用的是字段名;在一個 setter 方法情況下(只允許使用一個參數),它使用的是形參。

先通過屬性名字查找相同id或name的bean,找不到后再通過類型找,找到一個就注入,找不到或找到多個就報錯,和construction方式類似

5.基於java的注解

@Configuration表示當前類可以作為spring Ioc容器定義bean的來源,@Bean表示注解方法將返回一個對象,該對象應該被注冊為在 Spring 應用程序上下文中的 bean。

 

相當於:

在這里,帶有 @Bean 注解的方法名稱作為 bean 的 ID,它創建並返回實際的 bean。你的配置類可以聲明多個 @Bean。一旦定義了配置類,你就可以使用 AnnotationConfigApplicationContext 來加載並把他們提供給 Spring 容器

①:

或者

②:

帶參數的構造方法:

   

所以方式①和方式②都是一樣的。

注入Bean的依賴:

當 @Beans 依賴對方時,表達這種依賴性非常簡單,只要有一個 bean 方法調用另一個

@Import注解允許從另一個配置類中加載 @Bean 定義

 

 生命周期回調:

@Bean 注解支持指定任意的初始化和銷毀的回調方法,就像在 bean 元素中 Spring 的 XML 的初始化方法和銷毀方法的屬性:

在基於java注解配置的bean中可以起作用的回調方法

你可以使用 @PostConstruct 注釋作為初始化回調函數的一個替代,@PreDestroy 注釋作為銷毀回調函數的一個替代,繼承InitializingBean,DisposableBean 也可實現初始化和銷毀時的回調方法,其中優先級(調用的順序)@PostConstruct和@PreDestroy  >  繼承InitializingBean,DisposableBean > @Bean(initMethod 和 destroyMethod)

@Scope可以指定作用域


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM