Spring基於annotation的依賴注入實現

2021-07-02 21:30:33 字數 3743 閱讀 8642

spring3.0 以前,使用 xml 進行依賴配置幾乎是唯一的選擇。spring 3.0 的出現改變了這一狀況,它提供了一系列的針對依賴注入的註解,這使得spring ioc 在 xml 檔案之外多了一種可行的選擇。

1、將類標識為 bean

使用@repository、@service、@controller和@component,@repository 註解屬於最先引入的一批,它用於將資料訪問層 (dao 層 ) 的類標識為 spring bean。具體只需將該註解標註在 dao 類上即可。同時,為了讓 spring 能夠掃瞄類路徑中的類並識別出 @repository 註解,需要在 xml 配置檔案中啟用 bean 的自動掃瞄功能,這可以通過 實現。如下所示:

這樣我們不再需要在xml中顯式使用 進行 bean 的配置。spring 在容器初始化時將自動掃瞄 base-package 指定的包及其子包下的所有 class 檔案,所有標註了@repository、@service、@controller、@component 的類都將被註冊為 spring bean。

●@component 是乙個泛化的概念,僅僅表示乙個元件 (bean) ,可以作用在任何層次。

●@service 通常作用在業務層,但是目前該功能與 @component 相同。

●@constroller 通常作用在控制層,但是目前該功能與 @component 相同。

@component("staffdao")

public class staffdaoimp implements staffdao

通常使用"name"的形式生成bean的名稱,還有一種方式實現 beannamegenerator 介面,確認包含了乙個預設的無引數構造方法。然後在配置掃瞄器時使用屬性name-generator.使用spring管理bean預設作用域的是singleton,容器中只存在乙個例項,也可以通過@scope指定作用域為prototype,容器在接受到請求的時候,會每次都重新生成乙個新的物件給請求方。

2、指定 bean 的自動裝配策略

自動裝配是指,spring在裝配bean的時候,根據指定的自動裝配規則,將某個bean所需要引用型別的bean注入進來。通常使用 @resource、@autowired 和@qualifier。

①@autowired 和 @qualifier

使用 @autowired 註解進行裝配,只能是根據型別進行匹配。@autowired 註解可以用於 setter 方法、建構函式、字段,甚至普通方法,前提是方法必須有至少乙個引數。@autowired 標註作用於普通方法時,會產生乙個***,就是在容器初始化該 bean 例項的時候就會呼叫該方法。當然,前提是執行了自動裝配,對於不滿足裝配條件的情況,該方法也不會被執行。此時與@qualifier的配合使用可以實現根據bean的byname自動注入,例如:

@autowired  @qualifier("persondaobean") 

private persondao persondao;

如圖**:如果不使用@qualifier指定要裝配的bean名稱,spring會將容器裡型別為persondao的bean裝配給該類(根據型別裝配原則),當然通過**的控制可以實現業務的要求,不過各層的耦合會比較嚴重,不符合spring松耦合的理念,通常推薦@autowired、@qualifier配合使用完成byname裝配,下面將介紹更方便的byname裝配方式,@resource。

②@resource

如果希望根據 name 執行自動裝配,那麼應該使用jsr-250提供的@resource 註解,而不應該使用@autowired與@qualifier的組合。@resource使用 byname 的方式執行自動封裝。@resource 標註可以作用於帶乙個引數的 setter 方法、字段,以及帶乙個引數的普通方法上。@resource 註解有乙個 name 屬性,用於指定bean在配置檔案中對應的名字。如果沒有指定name屬性,那麼預設值就是字段或者屬性的名字。@resource和@qualifier的配合雖然仍然成立,但是 @qualifier對於@resource而言,幾乎與name屬性等效。如下:

@ resource (name="persondaobean") 

private persondao persondao;

3、例項演示

<?xml version="1.0" encoding="utf-8"?>

通過配置檔案可以看出,我們不再像之前ssh框架搭建例子裡,使用:

的方式,在配置檔案中完成依賴注入。hibernate配置檔案、日誌檔案的配置同sshssh框架搭建demo裡面相同,不再贅述。

②dao實現層

@component("staffdao")

public class staffdaoimp implements staffdao

public void setsessionfactory(sessionfactory sessionfactory)

/*...code...

*/

用到的第乙個annotation,@component("staffdao")將class staffdaoimp類標識為bean交給spring管理,staffdao為該bean 的名字。當程式執行的時候,讀spring配置檔案,根據:

搜尋com目錄,將component標識的bean注入到spring容器。@resource沒有指定name屬性,預設值是字段或者屬性的名字即裝配spring容器中名為sessionfactory的bean,sessionfactory的注入是通過配置檔案的方式完成的。一般情況下,系統級的bean通過配置檔案的方式注入,業務級的bean通過annotation注入。

③service實現層

@component("staffservice")

public class staffserviceimp implements staffservice

public void setstaffdao(staffdao staffdao)

/*...code...

*/

@component("staffservice")的功能是將class staffserviceimp類交給spring容器管理,@resource

(name=

"staffdao"

)的作用裝配名為staffdao的bean,面前我們已經將staffdaoimp類標識為staffdao並注入到了spring容器。name屬性值必須與之前注入的保持一致。

④action層

@component("staffaction")

public class staffaction extends actionsupport implements servletrequestaware,

servletresponseaware

@resource(name="staffservice")

public void setstaffservice(staffservice staffservice)

兩種方法的效果是相同的,可以根據自己的習慣,選擇性使用

Hibernate聯合主鍵Annotation

teacher類設定id,name為聯合主鍵 abc三種方式 新建teacherpk類,屬性id,name和getters,setters在teacher裡去掉id,name以及他們的getset方法 a 1給teacherpk加注釋 embeddable 2在teacher中加入teacherpk...

Django之資料聚合函式 annotate

在我們的部落格側邊欄有分類列表,顯示部落格已有的全部文章分類。現在想在分類名後顯示該分類下有多少篇文章,該怎麼做呢?最優雅的方式就是使用 django 模型管理器的annotate方法。blog models.py class article models.model title models.ch...

spring 基於註解的spring配置

spring是乙個基於ioc和aop的結構j2ee系統的框架 ioc 反轉控制 是spring的基礎,inversion of control 簡單說就是建立物件由以前的程式設計師自己new 構造方法來呼叫,變成了交由spring建立物件 di 依賴注入 dependency inject.簡單地說...