1. 程式人生 > >Spring註解之@Autowired、@Qualifier、@Resource、@Value

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

作用就和在xml配置檔案中的bean標籤中寫一個< 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 CloudGateway(四):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註解autowiredresource的區別。

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的時候經常會用到這些註解,那麼這些註解到底有什麼區別呢。我們先來