乡下人产国偷v产偷v自拍,国产午夜片在线观看,婷婷成人亚洲综合国产麻豆,久久综合给合久久狠狠狠9

  • <output id="e9wm2"></output>
    <s id="e9wm2"><nobr id="e9wm2"><ins id="e9wm2"></ins></nobr></s>

    • 分享

      深入淺出spring IOC中三種依賴注入方式

       月冷星河 2016-07-23

      spring的核心思想是IOC和AOP,IOC-控制反轉(zhuǎn),是一個(gè)重要的面向?qū)ο缶幊痰姆▌t來消減計(jì)算機(jī)程序的耦合問題,控制反轉(zhuǎn)一般分為兩種類型,依賴注入和依賴查找,依賴什么?為什么需要依賴?注入什么?控制什么?依賴注入和控制反轉(zhuǎn)是一樣的概念嗎?接觸新的知識,小編的腦袋中全是大大的問號,不過沒有關(guān)系,今天這篇博文,小編主要來簡單的介紹一下在spring IOC中依賴注入的方法。

      依賴注入和控制反轉(zhuǎn),目的是為了使類與類之間解耦合,提高系統(tǒng)的可擴(kuò)展性和可維護(hù)性。我們可以從以下幾個(gè)方面理解:

      a、參與者都有誰?

      b、依賴:誰依賴誰?為什么需要依賴?

      c、注入:誰注入誰?又注入了什么呢?

      d、控制反轉(zhuǎn):誰控制誰?控制什么?為什么叫反轉(zhuǎn)呢?存在正轉(zhuǎn)嗎?

      e、控制反轉(zhuǎn)和依賴注入是同一個(gè)概念嗎?我們需要弄明白上面的問題,這樣對于控制反轉(zhuǎn)和依賴注入的理解有大大的幫助。

      首先:第一個(gè)問題,參與者都有誰?

      1)對象

      2)IOC/DI容器

      3)某個(gè)對象的外部資源

      第二問題:依賴,誰依賴誰?為什么需要依賴?

      依賴嘛,很好理解的,對象依賴于IOC/DI容器,至于為什么要依賴呢?對象需要IOC/DI容器來提供對象需要的外部資源。

      第三個(gè)問題:注入,誰注入誰?又注入了什么呢?

      顯而易見是IOC/DI容器注入對象,注入了what呢?肯定注入的是某個(gè)需要的東西那就是注入對象所需要的資源,肯定不會(huì)注入無關(guān)緊要的內(nèi)容,你說呢?

      第四個(gè)問題:控制反轉(zhuǎn),誰控制誰?控制什么?為什么叫反轉(zhuǎn)呢?存在正轉(zhuǎn)嗎?

      控制反轉(zhuǎn),控制什么?肯定是IOC/DI容器控制對象,主要是控制對象實(shí)例的創(chuàng)建,反轉(zhuǎn)是相對于正向而言的,那么什么算是正向的呢?考慮一下常規(guī)情況下的應(yīng)用程序,如果要在A里面使用C,你會(huì)怎么做呢?當(dāng)然是直接去創(chuàng)建C的對象,也就是說,是在A類中主動(dòng)去獲取所需要的外部資源C,這種情況被稱為正向的。那么什么是反向呢?就是A類不再主動(dòng)去獲取C,而是被動(dòng)等待,等待IoC/DI的容器獲取一個(gè)C的實(shí)例,然后反向的注入到A類中。

      第五個(gè)問題:控制反轉(zhuǎn)和依賴注入式同一個(gè)概念嗎?

      依賴注入和控制反轉(zhuǎn)是對同一件事情的不同描述,從某個(gè)方面講,就是它們描述的角度不同。依賴注入是從應(yīng)用程序的角度在描述,可以把依賴注入描述完整點(diǎn):應(yīng)用程序依賴容器創(chuàng)建并注入它所需要的外部資源;而控制反轉(zhuǎn)是從容器的角度在描述,描述完整點(diǎn):容器控制應(yīng)用程序,由容器反向的向應(yīng)用程序注入應(yīng)用程序所需要的外部資源。

      了解了這些基本的概念,弄明白她們之間的聯(lián)系和區(qū)別,能夠幫助我們更好的理解,接著小編來重點(diǎn)介紹一下依賴注入,在spring ioc中有三種依賴注入,分別是:

      a、接口注入;

      b、setter方法注入;

      c、構(gòu)造方法注入;

      接著小編對這三種注入方式一一進(jìn)行講解,通過demo的講解,希望能夠幫助小伙伴們更好的理解,不足之處還請多多指教。

      接口注入

      [java] view plain copy print?

      深入淺出spring IOC中三種依賴注入方式

      1. publicclass ClassA {

      2. private InterfaceB clzB;

      3. publicvoid doSomething() {

      4. Ojbect obj = Class.forName(Config.BImplementation).newInstance();

      5. clzB = (InterfaceB)obj;

      6. clzB.doIt();

      7. }

      8. ……

      9. }

      解釋一下上述的代碼部分,ClassA依賴于InterfaceB的實(shí)現(xiàn),我們?nèi)绾潍@得InterfaceB的實(shí)現(xiàn)實(shí)例呢?傳統(tǒng)的方法是在代碼中創(chuàng)建 InterfaceB實(shí)現(xiàn)類的實(shí)例,并將賦予clzB.這樣一來,ClassA在編譯期即依賴于InterfaceB的實(shí)現(xiàn)。為了將調(diào)用者與實(shí)現(xiàn)者在編譯期分離,于是有了上面的代碼。我們根據(jù)預(yù)先在配置文件中設(shè)定的實(shí)現(xiàn)類的類名(Config.BImplementation),動(dòng)態(tài)加載實(shí)現(xiàn)類,并通過InterfaceB強(qiáng)制轉(zhuǎn)型后為ClassA所用,這就是接口注入的一個(gè)最原始的雛形。

      setter方法注入

      setter注入模式在實(shí)際開發(fā)中有非常廣泛的應(yīng)用,setter方法更加直觀,我們來看一下spring的配置文件:

      [java] view plain copy print?

      深入淺出spring IOC中三種依賴注入方式

      1. xmlns:xsi='http://www./2001/XMLSchema-instance'

      2. xmlns:aop='http://www./schema/aop'

      3. xmlns:tx='http://www./schema/tx'

      4. xsi:schemaLocation='http://www./schema/beans http://www./schema/beans/spring-beans-4.1.xsd

      5. http://www./schema/aop http://www./schema/aop/spring-aop-4.1.xsd

      6. http://www./schema/tx http://www./schema/tx/spring-tx-4.1.xsd'>

      接著我們來看一下,setter表示依賴關(guān)系的寫法

      [java] view plain copy print?

      深入淺出spring IOC中三種依賴注入方式

      1. import com.tgb.spring.dao.UserDao;

      2. publicclass UserManagerImpl implements UserManager{

      3. private UserDao userDao;

      4. //使用設(shè)值方式賦值

      5. publicvoid setUserDao(UserDao userDao) {

      6. this.userDao = userDao;

      7. }

      8. @Override

      9. publicvoid addUser(String userName, String password) {

      10. userDao.addUser(userName, password);

      11. }

      12. }

      構(gòu)造器注入

      構(gòu)造器注入,即通過構(gòu)造函數(shù)完成依賴關(guān)系的設(shè)定。我們看一下spring的配置文件:

      [java] view plain copy print?

      深入淺出spring IOC中三種依賴注入方式

      1. xmlns:xsi='http://www./2001/XMLSchema-instance'

      2. xmlns:aop='http://www./schema/aop'

      3. xmlns:tx='http://www./schema/tx'

      4. xsi:schemaLocation='http://www./schema/beans http://www./schema/beans/spring-beans-4.1.xsd

      5. http://www./schema/aop http://www./schema/aop/spring-aop-4.1.xsd

      6. http://www./schema/tx http://www./schema/tx/spring-tx-4.1.xsd'>

      我們再來看一下,構(gòu)造器表示依賴關(guān)系的寫法,代碼如下所示:

      [java] view plain copy print?

      深入淺出spring IOC中三種依賴注入方式

      1. import com.tgb.spring.dao.UserDao;

      2. publicclass UserManagerImpl implements UserManager{

      3. private UserDao userDao;

      4. //使用構(gòu)造方式賦值

      5. public UserManagerImpl(UserDao userDao) {

      6. this.userDao = userDao;

      7. }

      8. @Override

      9. publicvoid addUser(String userName, String password) {

      10. userDao.addUser(userName, password);

      11. }

      12. }

      接口注入 && setter注入 && 構(gòu)造器注入

      接口注入:

      接口注入模式因?yàn)榫邆淝秩胄?,它要求組件必須與特定的接口相關(guān)聯(lián),因此并不被看好,實(shí)際使用有限。

      Setter 注入:

      對于習(xí)慣了傳統(tǒng) javabean 開發(fā)的程序員,通過 setter 方法設(shè)定依賴關(guān)系更加直觀。如果依賴關(guān)系較為復(fù)雜,那么構(gòu)造子注入模式的構(gòu)造函數(shù)也會(huì)相當(dāng)龐大,而此時(shí)設(shè)值注入模式則更為簡潔。如果用到了第三方類庫,可能要求我們的組件提供一個(gè)默認(rèn)的構(gòu)造函數(shù),此時(shí)構(gòu)造子注入模式也不適用。

      構(gòu)造器注入:

      在構(gòu)造期間完成一個(gè)完整的、合法的對象。所有依賴關(guān)系在構(gòu)造函數(shù)中集中呈現(xiàn)。依賴關(guān)系在構(gòu)造時(shí)由容器一次性設(shè)定,組件被創(chuàng)建之后一直處于相對“不變”的穩(wěn)定狀態(tài)。只有組件的創(chuàng)建者關(guān)心其內(nèi)部依賴關(guān)系,對調(diào)用者而言,該依賴關(guān)系處于“黑盒”之中。

        本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
        轉(zhuǎn)藏 分享 獻(xiàn)花(0

        0條評論

        發(fā)表

        請遵守用戶 評論公約

        類似文章 更多