Spring註解之@Autowired、@Qualifier、@Resource、@Value
前言
@Autowired、@Qualifier、@Resource、@Value四個註解都是用於注入資料的,他們的作用就和在xml配置檔案中的bean標籤中寫一個
1、先給出一個場景
講@Autowired註解前先給出一個場景:
dao層程式碼
@Repository
public class AccountDao {
public void save() {
System.out.println("dao資料save成功了....");
}
}
service層程式碼
@Service public class AccountImpl implements AccountService { private AccountDao accountDao; @Override public void save() { accountDao.save(); } }
表現層controller程式碼:
//模擬一個表現層功能 public class AccountController { public static void main(String[] args) { //1.獲取核心容器物件 ClassPathXmlApplicationContext ac = new ClassPathXmlApplicationContext("Applicationcontext.xml"); //2.根據id獲取Bean物件 AccountService as = (AccountService)ac.getBean("accountImpl"); as.save(); System.out.println(as); } }
執行結果
相信大家對java.lang.NullPointerException
空指標異常已經習以為常了,特別親切.....
那麼為啥會出現這個異常呢?很顯然從程式碼中可以看出來service中有著 AccountDao
型別的屬性沒有注入而引發的空指標異常,那麼接下來就到@Autowired註解登場了....
2、@Autowired
Spring 2.5 引入了 @Autowired 註釋,它可以對類成員變數、方法及建構函式、引數等進行標註【主要還是用在變數和方法上】,完成自動裝配的工作。 通過 @Autowired的使用來消除 set ,get方法,也就是說,使用@Autowired註解注入屬性資料不需要這個類提供set方法,方便快捷。@Autowired
< property >
標籤的作用是一樣的。
在之前的文章Spring中如何使用工廠模式實現程式解耦?中,我們多多少少知道spring的IOC底層實際上就是一個Map結構容器,所謂key 就是 bean標籤 中的 id,value 則是對應 bean標籤 中的 class。
@Autowired自動裝配首先會在IOC容器中跳過key直接去容器中找到對應的屬性!也就是說與key無關。
@Autowired自動裝配的三種情況:
1、容器中有唯一的一個bean物件型別和被@Autowired修飾的變數型別匹配,就可以注入成功!
2、容器中沒有一個bean物件型別和被@Autowired修飾的變數型別匹配,則注入失敗執行報錯。
3、容器中有多個bean物件型別和被@Autowired修飾的變數型別匹配,則根據被@Autowired修飾的變數名尋找,找到則注入成功【重點】
很多人會忽略或者不清楚第三點!!!
3、@Qualifier
根據上面@Autowired的第三種情況,需要更改變數名來對應注入,這樣就對程式不是很靈活,於是有了@Qualifier這個註解。@Qualifier的作用是在按照類中注入的基礎之上再按照名稱注入。它在給類成員注入時不能單獨使用(但是在給方法引數注入時可以單獨使用),因此@Qualifier註解很受限制,因此用的不是很多。@Qualifier常常組合@Autowired一起使用,用來指明具體名字的自動裝配
@Autowired //如果單純一個@Autowired 註解則表示找型別為IAccuntDao的,如果有兩個型別為IAccuntDao的,則接著匹配型別為IAccuntDao而且名字為accountDao的【缺點:要改變數名指定】
@Qualifier("accountDao2") //加上這個註解直接找型別為IAccuntDao而且名字為accountDao的
private IAccuntDao accountDao;
所以這段程式碼註解的意思就是直接找型別為IAccuntDao而且名字為accountDao的元件
其實上面的註解等價於下面的註解,我們後面會講到:
@Resource("accountDao2")
private IAccuntDao accountDao;
4、@Resource
@Resource由J2EE提供,預設是按照byName自動注入(通過名字自動注入),@Resource有兩個重要的屬性,name和type,當然預設是通過name,這裡type屬性就沒必要講了,用type屬性多此一舉,還不如用@Autowired,因此對於@Resource記住通過名字自動注入就好了
5、@Autowired、@Resource的區別
不得不說這兩個註解非常相似,而且很容易混淆。
@Autowired、@Resource的主要區別主要有下面幾點:
@Autowired | @Resource | |
---|---|---|
註解提供者 | Spring | J2EE |
自動裝配方式 | 屬性 | 名字 |
其實主要的區別就這一兩點,當然也肯定有著細節,這裡就暫時不概述了。
當然比較重要的一點就是:@Resource 相當於 @Autowired + @Qualifier
6、@Value
由於@Autowired、@Qualifier、@Resource三者自動裝配只能針對於注入其他bean型別的資料,而基本型別和String型別無法使用上述註解實現。因此有了@Value這個註解,@Value專門用來服務基本型別和String型別。
另外@Value註解有一個value 屬性:用於指定資料的值。它可以使用spring中SpEL(也就是spring的EL表示式)。SpEL的寫法:${表示式},當然也可以類似mybatis中的 #{表示式} 的寫法
@Value("#{2*3}") //#寫法 表示6
private int age;
@Value("178") //普遍寫法 178
private int height;
@Value("${man.weight}") //SpEL的寫法一般操作配置檔案中資料
private int weight;
注意:集合型別的注入只能通過XML來實現
7、小結
以上的@Autowired、@Qualifier、@Resource、@Value四個註解都是用於注入資料的,他們的作用就和在xml配置檔案中的bean標籤中寫一個
如果本文對你有一點點幫助,那麼請點個讚唄,你的贊同是我最大的動力,謝謝~
最後,若有不足或者不正之處,歡迎指正批評,感激不盡!如果有疑問歡迎留言,絕對第一時間回覆!
歡迎各位關注我的公眾號,裡面有一些java學習資料和一大波java電子書籍,比如說周志明老師的深入java虛擬機器、java程式設計思想、核心技術卷、大話設計模式、java併發程式設計實戰.....都是java的聖經,不說了快上Tomcat車,咋們走!最主要的是一起探討技術,嚮往技術,追求技術,說好了來了就是盆友喔...
相關推薦
Spring註解之@Autowired、@Qualifier、@Resource、@Value
前言 @Autowired、@Qualifier、@Resource、@Value四個註解都是用於注入資料的,他們的作用就和在xml配置檔案中的bean標籤中寫一個 1、先給出一個場景 講@Autowired註解前先給出一個場景: dao層程式碼 @Repository public class Accoun
Spring註解之@Autowired詳解
使用@Autowired註解,標記類的建構函式、欄位、set方法或者配置方法,spring的依賴注入工具就可以對其進行自動裝配。意思是在我們嘗試從spring容器中獲取bean的時候,容器可以自動地進行建構函式注入、set注入。set方法可以看作是配置方法的特例,所以類比去理
Spring註解之@RequestBody、@RequestParam使用
@RequestBody:請求型別為application/json時,後臺使用該註解接收引數; @RequestParam:請求型別為application/x-www-form-urlencode
Spring Cloud之Gateway(四):TLS/SSL、配置、跨域訪問配置、執行器API、開發人員指南及MVC或Webflux搭建Gateway
版本:2.0.2.RELEASE 連結:http://spring.io/projects/spring-cloud-gateway#overview 本章主要目錄如下: Spring Cloud GatewayTLS/SSL是什麼? Spring Cloud
Spring註解中autowired和resource的區別。
1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在欄位上,或寫在setter方法上。 2、@Autowired預設按型別裝配(這個註解是屬業spring的),預設情況下必須要求依賴物件必須存在,如果要允許null 值,可以設定它的required屬性為false,如:@Auto
spring boot之整合shiro實現使用者認證、授權
一.shiro簡介 1.簡介 Apache Shiro是一個強大且易用的Java安全框架,執行身份驗證、授權、密碼學和會話管理。使用Shiro的易於理解的API,您可以快速、輕鬆地獲得任何應用程式,從最小的移動應用程式到最大的網路和企業應用程式。 Shiro 主
【Spring註解驅動開發】如何實現方法、構造器位置的自動裝配?我這樣回答讓面試官很滿意!
## 寫在前面 > 在 **冰河技術** 微信公眾號前面的文章中,我們介紹瞭如何使用註解來自動裝配Spring元件。之前將的都是在來的欄位上添加註解,那有沒有什麼方法可以實現方法、構造器位置的自動裝配嗎?今天我們就一起來探討下如何實現方法、構造器位置的自動裝配。 > > 關注 **冰河技術*
Spring註解之BeanPostProcessor與InitializingBean
cati 構造 ID The invoke leg .net 源碼 bool /*** BeanPostProcessor 為每個bean實例化時提供個性化的修改,做些包裝等*/ package org.springframework.beans.factory.con
深入理解spring註解之@ComponentScan註解
原創 深入理解spring註解之@ComponentScan註解 知了123 0人評論 149062人閱讀 2018-05-20 10:02:23
深入理解spring註解之@Bean註解
本文主要從以下幾個方面來學習一下spring的註解@Bean: 基於xml方式bean使用回顧 註解@Bean詳細使用說明 註解@Bean的原始碼解析 1,基於xml方式bean使用回顧 新建一個maven專案增加spring-con
Spring註解配置——@Autowired【轉】
轉自 http://www.cnblogs.com/caoyc/p/5626365.html @Autowired 註釋,它可以對類成員變數、方法及建構函式進行標註,完成自動裝配的工作。 通過 @Autowired的使
Spring註解之@ModelAttribute理解
在Spring MVC裡,@ModelAttribute通常使用在Controller方法的引數註解中,用於解釋model entity,但同時,也可以放在方法註解裡。 如果把@ModelAttribute放在方法的註解上時,代表的是:該Controller的所有方法在呼叫
Spring註解之 @PostConstruct和 @PreDestroy
在工作中你不得不承認有千奇百怪的需求,比如今天讓你新增這,而明天讓你刪除那的。我對spring中bean生命週期的理解還是源於兩年前公司做的一個外包專案。那是真還是迷迷糊糊不懂。。。真是不懂spring中的大愛,大智慧。。,在此啪啪暗自打臉。 下面介紹一對cp @PostC
Spring註解之實體類常用註解
import org.hibernate.annotations.AccessType; import org.hibernate.annotations.*; import javax.persistence.*; import javax.persistence.En
spring註解之自動裝配和屬性賦值
${} throws 定義類 on() wired 成對 功能 inter setter 1.自動裝配 1.1什麽是自動裝配? Spring利用依賴註入(DI),完成對IOC容器中各個組件的依賴關系賦值; [email protected]/@Quali
spring註解之@Import註解的三種使用方式
目錄 1、@Import註解須知 2、@Import的三種用法 3、@Import註解的三種使用方式總結 @ 1、@Import註解須知 1、@Import只能用在類上 ,@Import通過快
屬性注入之註解(@Autowired、@Qualifier、@Resource)
@Resource和@Autowired都是做bean的注入時使用,其實@Resource並不是Spring的註解,它的包是javax.annotation.Resource,需要匯入,但是Spring支援該註解的注入。 1、共同點 兩者都可以寫在欄位和setter方
終極講解,看了立馬懂 --》Spring註解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析
我們在使用spring的時候經常會用到這些註解,那麼這些註解到底有什麼區別呢。我們先來看程式碼 同樣分三層來看: Action 層: package com.ulewo.ioc; import org.springframework.beans.factory.annotation.Autowired; i
Spring @Resource、@Autowired、@Qualifier的註解注入及區別
spring2.5提供了基於註解(Annotation-based)的配置,我們可以通過註解的方式來完成注入依賴。在Java程式碼中可以使用 @Resource或者@Autowired註解方式來經行注入。雖然@Resource和@Autowired都可以來完成注入依賴,但它
Spring註解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析
Spring註解@Component、@Repository、@Service、@Controller @Resource、@Autowired、@Qualifier 解析 我們在使用spring的時候經常會用到這些註解,那麼這些註解到底有什麼區別呢。我們先來