轉自: http://ganshisheng.iteye.com/blog/438608
一、依賴注入(DI)簡介
依賴注入背后的基本原理是對象之間的依賴關系,可以通過以下幾種方式來實現:構造器的參數、工廠方法的參數,或給由構造函數或者工廠方法創建的對象設置屬性。因此,容器的工作就是創建bean時注入那些依賴關系。相對于由bean自己來控制其實例化、直接在構造器中指定依賴關系或者類似服務定位器模式這3種自主控制依賴關系注入的方法來說,控制從根本上發生了倒轉,這也正是控制反轉名字的由來。
依賴注入主要有兩種注入方式,即構造器注入和Setter注入。
1、構造器注入
基于構造器的依賴注入是通過調用帶參數的構造器來實現,每個參數代表著一個依賴。下面展示了用構造器參數來注入依賴關系的例子。
先創建一個對象(bean)
- public class HelloWorld{
- private Stringmsg;
- //需要一個默認無參構造器
- public HelloWorld(){}
- public HelloWorld(Stringmsg){
- this .msg=msg;
- }
- public StringgetMsg(){
- return msg;
- }
- public void setMsg(Stringmsg){
- this .msg=msg;
- }
- }
再修改配置文件applicationContext.xml,實例化bean
- <beanid= "hello" class = "com.spring.demo.HelloWorld" >
- <constructor-argindex= "0" >
- <value>HelloWorld!</value>
- </constructor-arg>
- </bean>
最后測試是否能夠得到注入的bean,并打印出對象的屬性。
- public static void main(String[]args){
- //讀取配置文件,獲得BeanFactory
- ApplicationContextcontext= new ClassPathXmlApplicationContext( "applicationContext.xml" );
- BeanFactoryfactory=context;
- HelloWorldhello=(HelloWorld)factory.getBean( "hello" );
- System.out.println(hello.getMsg());
- }
2、Setter注入
通過調用無參構造器或無參static工廠方法實例化bean之后,調用該bean的setter方法,即可實現基于setter的依賴注入。
創建一個對象
- public class HelloWorld{
- private Stringmsg;
- public StringgetMsg(){
- return msg;
- }
- public void setMsg(Stringmsg){
- this .msg=msg;
- }
- }
修改配置文件applicationContext.xml,實例化bean
- <beanid= "helloBean" class = "com.spring.demo.HelloWorld" >
- <propertyname= "msg" value= "HelloWorld!" />
- </bean>
測試類,獲得注入的bean
- public static void main(String[]args){
- //讀取配置文件,實例化IOC容器
- ApplicationContextcontext= new ClassPathXmlApplicationContext( "applicationContext.xml" );
- BeanFactoryfactory=context;
- HelloWorldhello=(HelloWorld)factory.getBean( "helloBean" );
- System.out.println(hello.getMsg());
- }
3. 接口注入( 不推薦 )
1.根據定義bean的配置創建并初始化BeanFactory實例
2.每個bean的依賴將以屬性、構造器參數、或靜態工廠方法參數的形式出現。當這些bean被實際創建時,這些依賴也將會提供給該bean。
3.每個屬性或構造器參數既可以是一個實際的值,也可以是對該容器中另一個bean的引用。
4.每個指定的屬性或構造器參數值必須能夠被轉換成特定的格式或構造參數所需的類型。
Spring會在容器被創建時驗證容器中每個bean的配置,包括驗證那些bean所引用的屬性是否指向一個有效的bean。在bean被實際創建之前,bean的屬性并不會被設置。伴隨著bean被實際創建,作為該bean的依賴bean以及依賴bean的依賴bean也將被創建和分配。
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
