Spring 常用註解

2021-09-22 21:21:11 字數 3822 閱讀 7454

--定義bean的註解

@controller

@controller("bean的名稱")

定義控制層bean,如action

@service          

@service("bean的名稱")

定義業務層bean

@repository   

@repository("bean的名稱")

定義dao層bean

@component  

定義bean, 不好歸類時使用.

--自動裝配bean (選用一種註解就可以)

@autowired  (srping提供的)

預設按型別匹配,自動裝配(srping提供的),可以寫在成員屬性上,或寫在setter方法上

@autowired(required=true)  

一定要找到匹配的bean,否則拋異常。 預設值就是true 

@autowired

@qualifier("bean的名字") 

按名稱裝配bean,與@autowired組合使用,解決按型別匹配找到多個bean問題。

@resource   jsr-250提供的

預設按名稱裝配,當找不到名稱匹配的bean再按型別裝配.

可以寫在成員屬性上,或寫在setter方法上

可以通過@resource(name="beanname") 指定被注入的bean的名稱, 要是未指定name屬性, 預設使用成員屬性的變數名,一般不用寫name屬性.

@resource(name="beanname")指定了name屬性,按名稱注入但沒找到bean, 就不會再按型別裝配了.

@inject   是jsr-330提供的

按型別裝配,功能比@autowired少,沒有使用的必要。

--定義bean的作用域和生命過程

@scope("prototype")

值有:singleton,prototype,session,request,session,globalsession

@postconstruct 

相當於init-method,使用在方法上,當bean初始化時執行。

@predestroy 

相當於destory-method,使用在方法上,當bean銷毀時執行。

--宣告式事務

@transactional  

@autowired @resource @qualifier的區別

實用理解:@autowired @resource 二選其一,看中哪個就用哪個。

簡單理解:

@autowired 根據型別注入, 

@resource 預設根據名字注入,其次按照型別搜尋

@autowired @qualifie("userservice") 兩個結合起來可以根據名字和型別注入

複雜理解:

比如你有這麼乙個bean

@service(「userservice」)

public class userserviceimpl implements userservice{};

現在你想在usercontroller 裡面使用這個userserviceimpl 

public class usercontroller {

@autowire   //當使用這個注入的時候上面的 userserviceimpl 只需要這樣寫 @service,這樣就會自動找到userservice這個型別以及他的子型別。userserviceimpl 實現了userservice,所以能夠找到它。不過這樣有乙個缺點,就是當userservice實現類有兩個以上的時候,這個時候會找哪乙個呢,這就造成了衝突,所以要用@autowire注入的時候要確保userservice只有乙個實現類。

@resource 預設情況下是按照名稱進行匹配,如果沒有找到相同名稱的bean,則會按照型別進行匹配,有人可能會想了,這下好了,用這個是萬能的了,不用管名字了,也不用管型別了,但這裡還是有缺點。首先,根據這個註解的匹配效果可以看出,它進行了兩次匹配,也就是說,如果你在userservice這個類上面這樣寫註解,@service,它會怎麼找呢,首先是找相同名字的,如果沒有找到,再找相同型別的,而這裡的@service沒有寫名字,這個時候就進行了兩次搜尋,顯然,速度就下降了許多。也許你還會問,這裡的@service本來就沒有名字,肯定是直接進行型別搜尋啊。其實不是這樣的,userserviceimpl 上面如果有@service預設的名字 是這個userserviceimpl,注意看,就是把類名前面的大寫變成小寫,就是預設的bean的名字了。 @resource根據名字搜尋是這樣寫@resource("userservice"),如果你寫了這個名字叫userservice,那麼userserviceimpl上面必須也是這個名字,不然還是會報錯。

@autowired @qualifie("userservice") 是直接按照名字進行搜尋,也就是說,對於userserviceimpl 上面@service註解必須寫名字,不寫就會報錯,而且名字必須是@autowired @qualifie("userservice") 保持一致。如果@service上面寫了名字,而@autowired @qualifie() ,一樣會報錯。

private userservice userservice;

說了這麼多,可能你有些說暈了,那麼怎麼用這三個呢,要實際的工作是根據實際情況來使用的,通常使用autowire和@resource多一些,bean的名字不用寫,而userserviceimpl上面能會這樣寫 @service("userservice")。這裡的實際工作情況,到底是什麼情況呢?說白了就是整個專案設計時候考慮的情況,如果你的架構設計師考慮的比較精細,要求比較嚴格,要求專案上線後的訪問速度比較好,通常是考慮速度了。這個時候@autowire沒有@resource好用,因為@resource可以根據名字來搜尋,是這樣寫的@resource("userservice")。這個@autowired @qualifie("userservice") 也可以用名字啊,為什麼不用呢,原因很簡單,這個有點長,不喜歡,增加工作量。因為根據名字搜尋是最快的,就好像查資料庫一樣,根據id查詢最快。因為這裡的名字與資料庫裡面的id是一樣的作用。這個時候,就要求你多寫幾個名字,工作量自然就增加了。而如果你不用註解,用xml檔案的時候,對於注入bean的時候要求寫乙個id,xml檔案時候的id就相當於這裡的名字。

說了那麼多沒用,你能做的就是簡單直接,什麼最方便就用什麼,

你就直接用@resource得了,如果你喜歡用@autowire也行,不用寫名字。

通常情況乙個bean的註解寫錯了,會報下面這些錯誤,最為常見,

no bean named 'user' is defined,這個表示沒有找到被命名為user的bean,通俗的說,就是名字為user的型別,以及它的子型別,出現這個錯誤的原因就是注入時候的型別名字為user,而搜尋的時候找不到,也就是說可能那個搜尋的型別,並沒有命令為user,解決辦法就是找到這個型別,去命令為user,

下面這個錯誤也常見,

no qualifying bean of type [com.service.userservice] found for dependency:

這個錯誤的原因就是型別上面沒有加@service這個注入,不僅僅是@service,如果是其他層也會出現這個錯誤,這裡我是以service為例子說明,如果是dao層就是沒有加@repository,controller層,則是沒有加@controller。

還有,如果你還是想再簡單點,無論是dao,controller,service三個層,都可以用這個註解,@component,這個註解通用所有的bean,這個時候你可能會說了,有通常的為什麼用的人少呢,那是因為mvc這個分層的設計原則,用@repository,@service,@controller,這個可以區別mvc原則中的dao,service,controller。便於識別。

Spring常用註解

spring常用註解 1 引入context命名空間 在spring的配置檔案中 配置檔案如下 xml xmlns context spring context 2.5.xsd 開啟配置 spring 會自動掃瞄cn.pic包下面有註解的類,完成bean的裝配。xml xmlversion 1.0 ...

Spring常用註解

在spring中常用的註解 autowired註解 不推薦使用,建議使用 resource autowired可以對成員變數 方法和建構函式進行標註,來完成自動裝配的工作。autowired的標註位置不同,它們都會在spring在初始化這個bean時,自動裝配這個屬性。要使 autowired能夠工...

spring常用註解

1 引入context命名空間 在spring的配置檔案中 配置檔案如下 xml 收藏 xmlns context spring context 2.5.xsd 開啟配置 spring 會自動掃瞄cn.pic包下面有註解的類,完成bean的裝配。xml xmlns xmlns xsi xmlns c...