Spring源碼系列:依賴注入-引言

在上面四篇文章中大概分析了一下Bean的載入,其實這個過程就是在Ioc容器中創建BeanDefinition的數據映射。可是對於Bean的實例化並未涉及,在以前的分析中也提到,bean的實例化是在依賴注入是才具體完成。java

關於依賴注入

關於Spring,咱們最早想到的就兩個Ioc和Aop;而後關於Ioc咱們又能牽扯出兩個:控制反轉和依賴注入。 控制反轉和依賴注入在網上被無數大神亦或菜鳥解讀過,這裏就不羅列那些概念了,直接看:post

不使用Springspa

public class UserService {
    //手動new一個
    UserDao userDao = new UserDaoImpl();
    public int insertUser(String userName) {
    	return userDao.insertUser(userName);
    }
}
複製代碼

使用Spring(以註解方式)設計

public class UserService {
    @Autowired
    private UserDao userDao;
    public int insertUser(String userName) {
    	return userDao.insertUser(userName);
    }
}
複製代碼

看起來貌似沒有啥很大的改變,區別呢?3d

咱們先來分析下在一個類中這兩種申明的區別:代理

UserDao userDao;code

userDao是UserDao類型的引用名稱。僅僅是聲明瞭一個變量引用名稱。並無作實例化,userDao的實例化能夠經過set方法進行設置(Spring中以前經常使用的就是set方法注入);當咱們初始化持有userDao的這個類時咱們還不知道userDao到底具體指向哪一個堆中的對象地址。cdn

UserDao userDao = new UserDaoImpl();對象

而這個,申明一個變量名稱,並將userDao直接指向new UserDaoImpl()建立的對象。blog

咱們來看Spring中關於注入以後對象地址以及不使用注入方式對象的地址:

一、直接注入

二、注入覆蓋了我本身的對象
三、本身手動new

經過上面三幅圖能夠明顯的看出,本身手動new的對象沒有使用代理的方式,而託管給Spring注入的對象均是經過動態代理來完成的。

關於動態代理:《豬弟拱Java》連載番外篇:Java代理(中)

總結:當某個角色(多是一個Java實例,調用者)須要另外一個角色(另外一個Java實例,被調用者)的協助時,在未使用Spring來管理Bean的程序設計過程當中,一般由調用者來建立被調用者的實例。但在Spring裏,建立被調用者的工做再也不由調用者來完成,所以稱爲控制反轉;建立被調用者實例的工做一般由Spring容器來完成,而後注入調用者,所以也稱爲依賴注入。

三個問題

那麼如今要考慮問題就是,何時會觸發咱們的依賴注入呢?Bean的實例化是否必須在依賴注入時才能完成呢?在Spring中又是經過哪些類來完成注入工做的呢?

一、何時會觸發咱們的依賴注入

答:用戶第一次向容器獲取Bean的時候出發。

二、Bean的實例化是否必須在依賴注入時才能完成

這個其實不是必須的,我們都知道BeanDefinition中有lazy-init這樣一個屬性,咱們能夠經過控制這個屬性的設置來讓容器完成對Bean的預實例化。預實例化就是說它的依賴注入是在實例化過程當中完成的。

第一和第二個問題將會在分析第三個問題的時候慢慢的細化分析。因此第三個問題其實沒啥鳥用,但也是最最最核心的,就是爲了引出後面關於一些具體類的分析的。

相關文章
相關標籤/搜索