1. 程式人生 > >【淺談JavaEE框架】Spring中@Autowired標籤與@Resource標籤的區別

【淺談JavaEE框架】Spring中@Autowired標籤與@Resource標籤的區別

@Autowired  Spring 2.5 引入了 @Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。  通過 @Autowired的使用來消除 set ,get方法。 要實現我們要精簡程式的目的。 @Autowired預設按照型別進行注入 @Autowired @Qualifier("personDaoxxx")這樣就是按照名稱進行裝配 @Autowired(required=true)必須注入值,不能為null,為false無論注入什麼值都是null autowire屬性取值如下: byType:按型別裝配,可以根據屬性的型別,在容器中尋找根該型別匹配的bean.如果發現多個,那麼將會丟擲異常。如果沒有找到,即屬性值為null。 byName:按名稱裝配,可以根據屬性的名稱,在容器中尋找根該屬性名相同的bean,如果沒有找到,即屬性值為null。 Constructor與byType的方式類似,不同之處在於它應用於構造器引數。如果在容器中沒有找到與構造器引數型別一致的bean,那麼將會丟擲異常。 Autodetect:通過bean類的自省機制來決定是使用constructor還是byType方式進行自動裝配。如果發現預設的構造器,那麼將使用byType方式。 ==================================================================================================== Spring中@Autowired標籤與@Resource標籤的區別 
強烈建議 放棄@Autowire 使用@Resource 原因 spring支援標準  Spring支援JSR-250註解 Spring不但支援自己定義的@Autowired註解,還支援由JSR-250規範定義的幾個註解,如:@Resource、 @PostConstruct及@PreDestroy。  1. @Autowired      @Autowired是Spring 提供的,需匯入      Package:org.springframework.beans.factory.annotation.Autowired;      只按照byType 注入。  2. @Resource      @Resource預設按 byName 自動注入,是J2EE提供的, 需匯入Package:        javax.annotation.Resource;      @Resource有兩個中重要的屬性:name和type ,而Spring將@Resource註解的name屬性解析為bean的      名字,而type屬性則解析為bean的型別。所以如果使用name屬性,則使用byName的自動注入策略,而使用      type屬性時則使用 byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用by      Name自動注入策略。      @Resource裝配順序     (1). 如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則丟擲異常;    (2). 如果指定了name,則從上下文中查詢名稱(id)匹配的bean進行裝配,找不到則丟擲異常;    (3). 如果指定了type,則從上下文中找到型別匹配的唯一bean進行裝配,找不到或者找到多個,都會丟擲異常;    (4). 如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退為一      個原始型別進行匹配,如果匹配則自動裝配;      @Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入。  3. 使用區別      @Resource(name="loginService")       private LoginService loginService;      @Autowired(required=false)@Qualifier("loginService")       private LoginService loginService;     (1)
[email protected]
與@Resource都可以用來裝配bean. 都可以寫在欄位上,或寫在setter方法上;     (2)[email protected] 預設按型別裝配,預設情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,如:@Autowired(required=false) .如果我們想使用名稱裝配可以結合 @Qualifier註解進行使用;      (3)[email protected](這個註解屬於J2EE的),預設安裝名稱進行裝配,名稱可以通過name屬性進行指定,如果沒      有指定name屬性,當註解寫在欄位上時,預設取欄位名進行安裝名稱查詢,如果註解寫在setter方法上預設取屬      性名進行裝配。當找不到與名稱匹配的bean時才按照型別進行裝 配。但是需要注意的是,如果name屬性一旦指      定,就只會按照名稱進行裝配。      推薦使用@Resource註解在欄位上,這樣就不用寫setter方法了.並且這個註解是屬於J2EE的,減少了與Spring的耦合,這樣程式碼看起就比較優雅 。 另外,通過實踐,還總結出一條規律: 如果將@requied或者@autowired寫了set方法之上,則程式會走到set方法內部。 但如果寫在了field之上,則不會進入set方法當中。 @Autowired預設按型別裝配,@Resource預設按名稱裝配,當找不到與名稱匹配的bean才會按型別裝配。 ------------------------------------------------------------------------------------------------ 細節問題總結:
1.當我們進行測試時,用ApplicationContext物件的getBean()方法尋找元件。在之前的配置檔案中我們會用<bean>標籤的id屬性去定義,在使用自動掃描註解後怎樣獲得組建的id呢? 在這種情況下,Spring會將被標註註解的類名,然後再將該類名的第一個字母變為小寫,放到getBean()方法中。如:UserBizImpl類的元件Id就會是userBizImpl,獲取時為context.getBean("userBizImpl"); 那麼,我們在使用註解時可以自定義元件的Id嗎? 當然可以。我們需要在為相應的類添加註解時,在註解之後新增自定義的類名,例如:
@Service("userBiz")
 
public class UserBizImpl implements UserBiz {
 
……
 
}
當我們在獲取該元件時,為context.getBean("userBiz); 2.在配置檔案中我們可以對元件(bean)的作用域範圍進行設定,它的預設值是單例模式,那麼在添加註解的情況下,我們怎樣設定元件的作用域範圍呢? 我們可以直接在為類添加註解的同時,運用另一個註解@Scope("prototype")來設定,如下
@Service("userBiz")@Scope("prototype")
 
public class UserBizImpl implements UserBiz {
 
……
 
}
3.在使用註解時,為元件設定初始化和銷燬方法: 在添加註解的相應的類中,如果想初始化或銷燬某個方法,我們可以直接在方法上添加註解,如下:
@PostConstruct
 
public void addItem() {
 
System.out.println("初始化方法");
 
}
 
@PreDestroy
 
public void testItem() {
 
System.out.println("釋放資源");
 
}

4.在使用Spring自動掃描元件後,怎樣進行依賴注入? 運用註解@Resource和@Autowired,併為依賴物件設定名稱,例如:
 
@Resource(name="userDao")
 
private UserDAO userDao = null;
首先它會根據名稱去找Spring自動掃描的並加入到Spring容器的元件(bean),如果有相同的名稱,則進行依賴注入,如果沒有相同的名稱。則會根據型別區尋找元件。 理解以上的內容後,你就可以很輕鬆的實現spirng零配置。 ------------------------------------------------------------------------------------------------ 專案後期開發工作 定義了大量的bean,現在需要為每個資料庫操作新增 日誌記錄,所以就定義了一個logBiz, 如果按照通常的做法,需要修改所有的配置檔案 新增property屬性,現在使用自動注入機制。 在baseAction中新增通用日誌方法,留出一個IogBiz介面,在繼承的子類action中,定義一個logBiz屬性 並用@Resouce 註解即可。

相關推薦

JavaEE框架Spring@Autowired標籤@Resource標籤區別

@Autowired  Spring 2.5 引入了 @Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。  通過 @Autowired的使用來消除 set ,get方法。 要實現我們要精簡程式的目的。 @Autowired預設

spring BootSpring@Controller和@RestController之間的區別

處理 public 不同 esp 舉例 rest control tro adding spring Boot入手的第一天,看到例子中的@RestController ............. 相同點:都是用來表示Spring某個類的是否可以接收HTTP請求 不同點:@C

社工U盤遊戲(上)

凡人是沒有資格討論社會工程學的,2333333333,接下來的淺談也不過是為了研究下setoolkit平臺的使用罷了,這個社工利用平臺由parrot預裝,其中大量模組呼叫msf平臺,什麼?又是msf??? 今天我們的標題是初識U盤遊戲,因為筆者選購的裝備還沒到貨,但先來一起探索一下U盤遊戲在社會工程學中是如何

社工釣魚網站(上)

唉,是不是經常看到王者榮耀領面板的連結?賬號密碼一輸~然後就沒有然後了,23333333不過講真,你仔細留意一下,那些介面挺low的,記得有一次,簡單看下那個釣魚網站的原始碼就會知道,它把使用者輸入的賬號密碼直接寫到了同目錄下的一個txt裡,然後那個txt可以直接拿下來,23333333 今天呢!我們

守護程序Demo:後臺監控程式-- Python實現

前言 最近在做的專案需要定期檢測某個程序是否執行,若掛了自動重啟,腦袋一拍覺得需要這樣一個守護程序 來進行監控,於是順便複習了一下守護程序。 正文 什麼是守護程序? 守護程序(daemon)是生存期長的一種程序。它們常常在系統引導裝入時啟動

Spring框架xml配置屬性 ref value的區別

剛開始學Spring框架時並沒太關注這麼細小的區別,偶然一次配置xml時對同一個bean的引用,兩個不同的類屬性都用ref一個正確一個報了錯誤,當時覺得和不解。 後來看了引用物件的原始碼,才發現雖然引用的是同一個bean但兩個物件的屬相型別明顯不一樣,一個是物件引用型別,一

Spring框架xml配置屬性refvalue的區別

mapper idt 明顯 nbsp www 技術分享 inf border 配置 1、spring批量掃描mybatis的mapper,使用value 2、spring管理mybatis的單個mapper,用的是ref 雖然引用的是同一個bean,但兩個對象的

Spring@Autowired註解、@Resource註解的區別

不用 它的 查找 允許 type 規範 找到 註入 以及 Spring不但支持自己定義的@Autowired註解,還支持幾個由JSR-250規範定義的註解,它們分別是@Resource、@PostConstruct以及@PreDestroy。   @Resource的作

轉:Spring @Autowired標籤 @Resource標籤區別

Spring不但支援自己定義的@Autowired註解,還支援由JSR-250規範定義的幾個註解,如:@Resource、 @PostConstruct及@PreDestroy。 1. @Autowired    @Autowired是Spring 提供的,需匯入  

Spring @Autowired標籤 @Resource標籤區別

Spring不但支援自己定義的@Autowired註解,還支援由JSR-250規範定義的幾個註解,如:@Resource、 @PostConstruct及@PreDestroy。 1. @Autowired     @Autowire

spring的FactoryBeanObjectFactory的區別

一、介面定義 : public interface FactoryBean<T> { //獲取物件的工廠方法 @Nullable T getObject() throws Exception; //物件型別 @Nullable

spring@Autowired註解、@Resource註解的區別,以及@Qualifier的使用

Spring不但支援自己定義的@Autowired註解,還支援幾個由JSR-250規範定義的註解,它們分別是@Resource、@PostConstruct以及@PreDestroy。   @Resource的作用相當於@Autowired,只不過@Autowired按b

spring的AOPAspectJ的區別

根據我看spring官方文件的理解(不出意外是最正確的答案):①選擇spring的AOP還是AspectJ?spring確實有自己的AOP。功能已經基本夠用了,除非你的要在介面上動態代理或者方法攔截精確到getter和setter。這些都是寫奇葩的需求,一般不使用。②在使用

菜鳥看框架——EF框架

       引言    在上一篇部落格中說道在合作小組中接觸到了很多新的知識,這些新的知識讓我感到我們現在還是一隻很弱小的菜 鳥,我們根本不知道外面的事物是多麼的新鮮,在我們之外還有多少東西是需要

Spring筆記三SpringBean(XML方式裝配)

       我們可以把 Spring 看作一個大型的工廠,而 Spring 容器中的 Bean 就是該工廠的產品。要想使用這個工廠生產和管理Bean,就需要在配置檔案中告訴它需要哪些 Be

記錄spring一個介面多個實現類

重構遇到個小問題,記錄下: 錯誤資訊: *************************** APPLICATION FAILED TO START *************************** Description: Field xxxService in com.ali

JVM之記憶體模型

           java虛擬機器在執行java程式的過程中會把它所管理的記憶體劃分為若干個不同的資料區域。每個區域有自己建立和銷燬時間,根據《java虛擬機器規範》的規定,java虛擬機器所管理的

spring對控制反轉和依賴注入的理解

由於最近沒有太多時間,不能深入的瞭解控制反轉和依賴注入,只好把別人的理解轉載過來,非常痛恨市面上各種教程對所謂的術語張口就來,等自己有了時間一定要寫出新手都能看懂的教程。     首先想說說IoC(Inversion of Control,控制反轉)。這是spring的核心,貫穿始終。所謂IoC

Spring筆記三SpringBean(XML方式配置)

我們可以把 Spring 看作一個大型的工廠,而 Spring 容器中的 Bean 就是該工廠的產品。要想使用這個工廠生產和管理Bean,就需要在配置檔案中告訴它需要哪些 Bean,以及需要使用何種方法將這些 Bean 裝配到一起。 首先,分清楚 JavaBean 和 

CTF到滲透測試滲透測試之資訊收集

                     前言    從一個ctf選手到一個滲透測試工程師,第一步需要改變的就是學習資訊收集。滲透測試不是比賽,不會有提示,不會有檢視原始碼內藏提示等等,甚至你不可以使用掃描器(比如ctf中常見的AWVS),sqlmap等等。    工作中,一般進行的都是黑盒測試,你得考慮到廠