一,爲何會出現依賴注入這個概念?spring
控制反轉(IoC=Inversion of Control),是一種思想,指的是控制權的轉移,即(依賴)控制權由應用代碼中轉到了第三方外部容器(如Spring容器)。設計模式
二,Spring-IoC容器app
對於 Spring 框架來講,所謂 IoC就是由 Spring 來負責控制對象的生命週期和對象間的關係, 用 XML 來定義生成對象的模式。框架
在一個對象中,若是要使用另外的對象,就必須獲得它(本身 new 一個,或者從 JNDI 中查詢一個),使用完以後還要將對象銷燬(好比 Connection 等)。那麼 Spring-IoC 是如何作的呢?this
全部的類都會在 Spring 容器中登記,告訴 Spring 你是個什 麼東西,你須要什麼東西,而後 Spring 會在系統運行到適當的時候,把你要的東西主動給你,同時也把你交給其餘須要你的東西。全部的類的建立、銷燬都由 Spring 來控制,也就是說控制對象生存週期的再也不是引用它的對象,而是 Spring 。對於某個具體的對象而言,之前是它控制其餘對象,如今是全部對象都被 Spring 控制。spa
二,Spring-IoC的使用設計
在下面例子中,咱們使用 Spring 提供的 IoC 容器來管理咱們的用戶註冊類。code
UserRegister
依賴於UserDao
的實現類,咱們使用 IoC 容器在運行期動態的爲UserRegister
注入UserDao
的實現類。即UserRegister
對UserDao
的依賴關係由容器注入,UserRegister
不用關心UserDao
的任何具體實現類。若是要更改用戶的持久化方式,只要修改配置文件 applicationContext.xml 便可。依賴注入機制減輕了組件之間的依賴關係,同時也大大提升了組件的可移植性,這意味着,組件獲得重用的機會將會更多。xml
用戶註冊類UserRegister
的部分代碼以下:對象
public class UserRegister { private UserDao userDao = null;//由容器注入的實例對象 public void setUserDao(UserDao userDao){ this.userDao = userDao; } // UserRegister的業務方法 }
在其它的UserRegister
方法中就能夠直接使用userDao
對象了,它的實例由Spring
容器主動爲它建立。可是,如何組裝一個UserDao
的實現類到UserRegister
中呢?哦,Spring 提供了配置文件來組裝咱們的組件。Spring 的配置文件 applicationContext.xml 代碼片段以下:
<bean id="userRegister" class="com.dev.spring.simple.UserRegister"> <property name="userDao"><ref local="userDao"/></property> </bean> <bean id="userDao" class="com.dev.spring.simple.MemoryUserDao"/>
四,依賴注入
組件的依賴關係由容器實現,那麼容器如何知道一個組件依賴哪些其它的組件呢?如上面例子中,容器如何得知UserRegister
依賴於UserDao
呢?
Spring的組件提供了一系列所謂的回調方法(也叫注入方法),這些注入方法會告知容器它所依賴的組件,也就是將實例變量傳到另外一個對象中去。依賴注入爲實現IOC思想作技術支持。
根據注入方法的不一樣,咱們能夠將 IoC 分爲三種形式:接口注入,值注入,構造方法注入。根據注入類型的不一樣,分爲:值類型注入(8大基本數據類型),引用類型注入(Dao注入Service,service注入action,也就是依賴對象注入)。
五,依賴注入與控制反轉
IoC框架使用依賴注入做爲實現控制反轉的方式,可是控制反轉還有其餘的實現方式,因此不能將控制反轉和依賴注入等同。
六,總結