spring註解集合

2022-03-07 21:10:32 字數 3634 閱讀 9523

spring 2.5 引入了 @autowired 注釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。

spring 通過乙個 beanpostprocessor 對 @autowired 進行解析,所以要讓@autowired 起作用必須事先在 spring 容器中宣告autowiredannotationbeanpostprocessor bean。

配置檔案xml:

當我們在 spring 容器中配置了兩個型別為a型別的 bean,當我們使用@autowired注入時,因為不知道注入哪乙個,就會報錯,所以這個時候就用到了@qualifier

spring 允許我們通過 @qualifier 注釋指定注入 bean 的名稱。

@autowired是根據型別注入的(bytype),@autowired和@qualifier 結合使用時,自動注入的策略就從 bytype 轉變成 byname 了。@autowired 可以對成員變數、方法以及構  造函式進行注釋,而@qualifier 的標註物件是成員變數、方法入參、建構函式入參。正是由於注釋物件的不同,所以 spring 不將 @autowired 和@qualifier 統一成乙個注釋類。

@qualifier 只能和 @autowired 結合使用,是對 @autowired 有益的補充。一般來講,@qualifier 對方法簽名中入參進行注釋會降低**的可讀性,而對成員變數注釋則相對好一  些。

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 自動注入策略。

要讓 jsr-250 的注釋生效,除了在 bean 類中標註這些注釋外,還需要在 spring 容器中註冊乙個負責處理這些注釋的 beanpostprocessor:

commonannotationbeanpostprocessor 實現了 beanpostprocessor 介面,它負責掃瞄使用了 jsr-250 注釋的 bean,並對它們進行相應的操作。

jsr-250 為初始化之後/銷毀之前方法的指定定義了兩個注釋類,分別是 @postconstruct 和 @predestroy,這兩個注釋只能應用於方法上。標註了 @postconstruct 注釋的方法將在類例項化後呼叫,而標註了 @predestroy 的方法將在類銷毀之前呼叫。

使用 簡化配置

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

而我們前面所介紹的autowiredannotationbeanpostprocessorcommonannotationbeanpostprocessor就是處理這些注釋元資料的處理器。但是直接在 spring 配置檔案中定義這些 bean 顯得比較笨拙。spring 為我們提供了一種方便的註冊這些beanpostprocessor的方式,這就是 。

將隱式地向 spring 容器註冊autowiredannotationbeanpostprocessorcommonannotationbeanpostprocessorpersistenceannotationbeanpostprocessor以及equiredannotationbeanpostprocessor這 4 個 beanpostprocessor。

在配置檔案中使用 context 命名空間之前,必須在 元素中宣告 context 命名空間。

通過注釋定義 bean,從 xml 配置檔案中完全移除 bean 定義的配置。

spring 2.5 在 @repository 的基礎上增加了功能類似的額外三個註解:@component、@service、@constroller,它們分別用於軟體系統的不同層次:

自動掃瞄

的 base-package 屬性指定了需要掃瞄的類包,類包及其遞迴子包中所有的類都會被處理。

還允許定義過濾器將基包下的某些類納入或排除。spring 支援以下 4 種型別的過濾方式,通過下表說明:

過濾器型別

說明注釋

假如 com.baobaotao.someannotation 是乙個注釋類,我們可以將使用該注釋的類過濾出來。

類名指定

通過全限定類名進行過濾,如您可以指定將 com.baobaotao.boss 納入掃瞄,而將 com.baobaotao.car 排除在外。

正規表示式

通過正規表示式定義過濾的類,如下所示: com\.baobaotao\.default.*

aspectj 表示式

通過 aspectj 表示式定義過濾的類,如下所示: com. baobaotao..*service+

值得注意的是 配置項不但啟用了對類包進行掃瞄以實施注釋驅動 bean 定義的功能,同時還啟用了注釋驅動自動注入的功能(即還隱式地在內部註冊了autowiredannotationbeanpostprocessorcommonannotationbeanpostprocessor),因此當使用 後,就可以將 移除了。

預設情況下通過@component定義的 bean 都是 singleton 的,如果需要使用其它作用範圍的 bean,可以通過@scope注釋來達到目標。

採用具有特殊語義的注釋

spring 2.5 中除了提供@component注釋外,還定義了幾個擁有特殊語義的注釋,它們分別是:@repository@service@controller。在目前的 spring 版本中,這 3 個注釋和@component是等效的,但是從注釋類的命名上,很容易看出這 3 個注釋分別和持久層、業務層和控制層(web 層)相對應。雖然目前這 3 個注釋和@component相比沒有什麼新意,但 spring 將在以後的版本中為它們新增特殊的功能。所以,如果 web 應用程式採用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別採用@repository@service@controller對分層中的類進行注釋,而用@component對那些比較中立的類進行注釋。

本文參考:

spring註解對集合類進行標註

一 對集合類進行標註 1 乙個實體類中宣告乙個帶泛型的集合 2 給這個集體新增乙個註解 autowired 3 當spring容器啟動時,給集合注入值起,會將spring容器中所有的bean 匹配泛型的類及其子類 的所有該集合的值 重點 基於map的集合.key指的spring容器中bean的名稱。...

Spring註解 Import註解

常用的匯入註解分類 註冊自己寫的類service dao controller可用包掃瞄 元件標註註解 controller service repository component bean 匯入的第三方包裡面的元件 import 快速給容器中匯入乙個元件 1 import 要匯入到容器中的元件 ...

spring註解之 Scope註解

1,scope註解是什麼 scope註解是springioc容器中的乙個作用域,在 spring ioc 容器中具有以下幾種作用域 基本作用域singleton 單例 prototype 多例 web 作用域 reqeust session globalsession 自定義作用域 a.single...