1. 程式人生 > >關於spring的@resource註解的欄位注入和setter注入的區別

關於spring的@resource註解的欄位注入和setter注入的區別

請問欄位注入的時候
1
@resource
private IUserDao userDao;
//請問如果我這樣寫了之後,是不是不用寫相對應的setter getter方法了?

2
private IUserDao userDao;
@resource
public void setter UserDao(UserDao userDao){
   this.userDao=userDao;
}; 
//請問如果換成這樣,和1有什麼區別的呢? 功能是否一樣? 假設功能一樣的話,明顯1好一點啊,因為就兩行,而2有5行之多。
[email protected]應用在欄位上,則注入規則是:
  a.先使用欄位名字匹配bean,查詢到bean則注入,如果型別不匹配則此時有異常,注入失敗。
  b.如果欄位名字沒有匹配到Bean則spring會嘗試採用欄位型別匹配,如果找打bean則注入,如果欄位型別是介面則有可能會匹配到多個型別,則會丟擲匹配到多個bean的異常, 注入失敗。
  
[email protected]
應用在setter上(應用到屬性),則注入規則是:   a.先使用屬性名字匹配bean,查詢到bean則注入,如果型別不匹配則此時有異常,注入失敗。   b.如果屬性名字沒有匹配到Bean則spring會嘗試採用屬性引數型別匹配,如果找打bean則注入,如果屬性引數型別是介面則有可能會匹配到多個型別,則會丟擲匹配到多個bean的異常.注入失敗。    注意是屬性的引數型別,並不是屬性的型別,注意區別   3.小結   a.名稱------>b.型別或引數型別(屬性時). 參考:http://www.cnblogs.com/kuailewangzi1212/archive/2012/03/21/2410188.html
追問:
你複製也沒用,我就問你 兩個問題    1他們最終實現的功能是否一致,我並不想知道他們注入規則的區別,因為一般情況下,我們先保證我們在注入規則是完全正確的。 2 明顯1的程式碼量少於setter的程式碼量, 如果是我用,肯定次次都用1 欄位注入,為什麼要用@resource setter注入?
追答:

就你的例子來說,第一種首先按照userDao名字來注入,然後按照IUserDao型別尋找注入;第二種首先也按名字注入,失敗後則按照引數型別注入,即UserDao型別注入。

你問的第二個問題,參考以下例子:

1234567891011121314151617//介面IUserDaopublic interface
 IUserDao;//介面實現1public class UserDao1 implements IUserDao {...};//介面實現2public class UserDao2 implements IUserDao {...};1、採用欄位名稱,則會注入失敗@resourceprivate IUserDao userDao;2、採用set方法注入,則可以注入UserDao1@resourcepublic void setUserDao(UserDao1 userDao)//注入UserDao2 @resourcepublic void setUserDao(UserDao2 userDao)
追問:
根據你的
A你的第一句話,若欄位注入,spring會去xml中找<bean id="userDao" class="某實現類"/>,找不到id就報錯,是把。
B第二句話,spring是先按照“名字”,名字來源是setUserDao中將首字母U改為u的那個“名字”userDao,對吧?
追答:

你的A有點錯誤,按照欄位注入在按名字找不到的時候,會按照欄位型別查詢,在例子中則會找IUserDao型別,若找不到IUserDao型別則判斷是錯誤,或者找到多個也判定為錯誤。

例子中,bean的配置可能如下:

123<bean id="userDao1" class="UserDao1"/><bean id="userDao2" class="UserDao2"/>//第一種查詢方式則會發現兩個IUserDao

第二種則是先按名字查詢,找不到就按引數型別注入,查詢UserDao1 或者UserDao2 等。

相關推薦

關於spring的@resource註解注入setter注入區別

請問欄位注入的時候 1 @resource private IUserDao userDao; //請問如果我這樣寫了之後,是不是不用寫相對應的setter getter方法了? 2 private IUserDao userDao; @resource public v

Spring實現自動裝配(spring註解詳解)手動注入比較

概述 註釋配置相對於 XML 配置具有很多的優勢: 它可以充分利用 Java 的反射機制獲取類結構資訊,這些資訊可以有效減少配置的工作。如使用 JPA 註釋配置 ORM 對映時,我們就不需要指定 PO 的屬性名、型別等資訊,如果關係表字段和 PO 屬性名、型別都一致,您

獲取Django model中的的verbose_name

定義模型:  class Game(models.Model): name = models.CharField(u'遊戲名稱',max_length=30) gameid = models.CharField(u'遊戲id',max_length=20)

sql 新增 增加備註 刪除備註

新增備註 /*oracle*/ comment on column 表名.列名 is '備註';/*mysql*/ ALTER TABLE 表名 MODIFY  欄位名 型別 COMMENT '備註'; 刪除表字段 alter table <表名> drop co

mysql型別查詢語句資料型別的關係

mysql欄位型別和查詢語句資料型別的關係 實驗 根據資料庫儲存的欄位型別和查詢語句中的資料型別列出下表: 資料庫 查詢語句 結果 string string ①

解決一個表中的資料由同表中兩加權得到(用觸發器解決)

本次實驗一張表中的90%的資料由相關連的外表(b表)資料得到,即用觸發器得到。 https://blog.csdn.net/IT_95/article/details/84064958 那麼如何實現這張表裡面的資料得到一個總的值放在一個欄位呢? 第一時間的想法是在這張表(b表)裡面加觸發

查詢資料庫中某表的型別

mysql: 1. 查詢資料庫中的所有表:show tables; 2. 查詢表中的欄位名和欄位型別: show columns from table_name(表名);                 &n

MYSQL資料庫 的 decimal 型別 Java 的BigDecimal

mysql中的decimal , 在java中的用BigDecimal表示的。   decimal decimal(18,0) 18是定點精度,0是小數位數。 decimal(a,b) a指定指定小數點左邊和右邊可以儲存的十進位制數字的最大個數,最大精度38。 b指定

mysql型別基礎命令

欄位型別 日期和時間資料型別 MySQL資料型別 含義 date 3位元組,日期,格式:2014-09-18 time 3位元組,時間,格式:08:42:30 datetime 8位元組,日期時間,格式:2014-09-18 08:42:

java中利用stream求list集合中某個

直接開始秀: 如果你的list是這種的: List<Integer> numbers = Arrays.asList(3, 2, 2, 3, 7, 3, 5); 那麼就這麼求: IntSummaryStatistics stats = number

spring(一)控制反轉依賴注入

       控制反轉降低了類和類之間的耦合度,利於修改和擴充套件,提供了完整的IOC實現,讓我們專注於業務類和Dao類的設計,體現的是面向介面程式設計的思想,核心是BeanFactory。 需要引入的架包: commons-logging: spring執行依賴這個元件

Django2.0-db(3)-模型常用, navieaware時間

模型常用欄位 常用欄位 Django中,定義了一些Field來與資料庫表中的欄位型別來進行對映。 AutoField 對映到資料庫中的是int型別,可以有自動增長的特性。 如果不指定主鍵,模型會自動生

Hive:map儲存取用 ( str_to_map函式 )

str_to_map(字串引數, 分隔符1, 分隔符2) 使用兩個分隔符將文字拆分為鍵值對。 分隔符1將文字分成K-V對,分隔符2分割每個K-V對。對於分隔符1預設分隔符是 ',',對於分隔符2預設分隔符是 '='。   例子: 1. 建立map欄位 DROP TABLE IF E

Spring註解@Transactional在oraclmysql差異

嘿嘿 !從今天開始圖圖開始寫部落格啦 這是圖圖的第一個部落格 ,不足之處請大家指出,共同進步。 @Transactional是Spring中的事務註解,其引數為readOnly用於設定當前事務是否為只讀事務,設定為true表示只讀,false則表示可讀寫,如@Transactional(re

SQL中刪除單重複多個重複的方法

--刪除OrderDetails表中materialscode欄位重複的行,只保留ID最小的一行資料 delete from OrderDetails where materialscode in (select materialscode from OrderDetails group by

記憶體分配與棧 XIP(片上執行)

1 記憶體分配與欄位       程式編譯時,編譯器將程式碼翻譯成彙編程式碼,然後彙編器將彙編程式碼翻譯成機器程式碼(二進位制),得到目標檔案,最後連結器將目標檔案連結成可執行檔案。而目標檔案和可執行檔案的格式一般是類似的,由一個個se

mybatis解決實體類表列名不一樣的問題

Book類有成員變數:bookName,price book表有列名:book_name,price 解決方法一:在BookMapper.xml檔案的sql語句中使用別名 例如: <select id="getAllBooks" resultType="Book">

SQLServer學習筆記 --- 如何獲取檢視 view 的型別

wechat:812716131 ------------------------------------------------------ 技術交流群請聯絡上面wechat ----------------------------------------------

jmeter summary report 意思設定集合點解釋

1.需要在新增一個名為summary report的監聽器,跑完之後檢視 Label:取樣器/監聽器名稱 Samples :事務數量 Average:平均一個完成一個事務消耗的時間(平均響應時間) Median:所有響應時間的中間值,也就是 50%使用者的響應時間,大概是這

Sql使用SUMUNION ALL 查詢兩張表中指定

1、t_test1表           t_test2表       2、查詢需求:求t_test1.num與t_test2.amount之和   方法一: SELECT