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

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