Spring註解之@Autowired、@Qualifier、@Resource、@Value

前言 @Autowired、@Qualifier、@Resource、@Value四個註解都是用於注入數據的,他們的做用就和在xml配置文件中的bean標籤中寫一個標籤的做用是同樣的!本篇中特別要講解的重心是@Autowired註解javascript

一、先給出一個場景

講@Autowired註解前先給出一個場景:java

dao層代碼spring

@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);
    }
}
複製代碼

運行結果 mybatis

在這裏插入圖片描述
相信你們對 java.lang.NullPointerException空指針異常已經習覺得常了,特別親切.....

那麼爲啥會出現這個異常呢?很顯然從代碼中能夠看出來service中有着 AccountDao 類型的屬性沒有注入而引起的空指針異常,那麼接下來就到@Autowired註解登場了....併發

二、@Autowired

Spring 2.5 引入了 @Autowired 註釋,它能夠對類成員變量、方法及構造函數、參數等進行標註【主要仍是用在變量方法上】,完成自動裝配的工做。 經過 @Autowired的使用來消除 set ,get方法,也就是說,使用@Autowired註解注入屬性數據不須要這個類提供set方法,方便快捷@Autowired做用就和在xml配置文件中的bean標籤中寫一個< property >標籤的做用是同樣的。ide

在以前的文章Spring中如何使用工廠模式實現程序解耦?中,咱們多多少少知道spring的IOC底層實際上就是一個Map結構容器,所謂key 就是 bean標籤 中的 id,value 則是對應 bean標籤 中的 class函數

@Autowired自動裝配首先會在IOC容器中跳過key直接去容器中找到對應的屬性!也就是說與key無關。學習

@Autowired自動裝配的三種狀況:

一、容器中有惟一的一個bean對象類型和被@Autowired修飾的變量類型匹配,就能夠注入成功! 二、容器中沒有一個bean對象類型和被@Autowired修飾的變量類型匹配,則注入失敗運行報錯。 三、容器中有多個bean對象類型和被@Autowired修飾的變量類型匹配,則根據被@Autowired修飾的變量名尋找,找到則注入成功【重點

不少人會忽略或者不清楚第三點!!!

三、@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;
複製代碼

四、@Resource

@Resource由J2EE提供,默認是按照byName自動注入(經過名字自動注入),@Resource有兩個重要的屬性,name和type,固然默認是經過name,這裏type屬性就不必講了,用type屬性畫蛇添足,還不如用@Autowired,所以對於@Resource記住經過名字自動注入就行了

五、@Autowired、@Resource的區別

不得不說這兩個註解很是類似,並且很容易混淆。

@Autowired、@Resource的主要區別主要有下面幾點:

@Autowired @Resource
註解提供者 Spring J2EE
自動裝配方式 屬性 名字

其實主要的區別就這一兩點,固然也確定有着細節,這裏就暫時不概述了。

固然比較重要的一點就是:@Resource 至關於 @Autowired + @Qualifier

六、@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來實現

七、小結

以上的@Autowired、@Qualifier、@Resource、@Value四個註解都是用於注入數據的,他們的做用就和在xml配置文件中的bean標籤中寫一個標籤的做用是同樣的!

若是本文對你有一點點幫助,那麼請點個讚唄,你的贊同是我最大的動力,謝謝~

最後,如有不足或者不正之處,歡迎指正批評,感激涕零!若是有疑問歡迎留言,絕對第一時間回覆!

歡迎各位關注個人公衆號,裏面有一些java學習資料和一大波java電子書籍,好比說周志明老師的深刻java虛擬機、java編程思想、核心技術卷、大話設計模式、java併發編程實戰.....都是java的聖經,不說了快上Tomcat車,咋們走!最主要的是一塊兒探討技術,嚮往技術,追求技術,說好了來了就是盆友喔...

在這裏插入圖片描述
相關文章
相關標籤/搜索