老馬舉了一個小例子,是開發(fā)一個電影列舉器(MovieList),這個電影列舉器需要使用一個電影查找器(MovieFinder)提供的服務(wù),偽碼如下: 1/**//*服務(wù)的接口*/
2public interface MovieFinder {
3 ArrayLi " /> 国产综合无码一区二区色蜜蜜,暖暖 免费 高清 日本在线,幸福草电视剧演员表介绍

天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

深度理解依賴注入

1.依賴在哪里
   老馬舉了一個小例子,是開發(fā)一個電影列舉器(MovieList),這個電影列舉器需要使用一個電影查找器(MovieFinder)提供的服務(wù),偽碼如下:

 1/*服務(wù)的接口*/
 2public interface MovieFinder {
 3    ArrayList findAll();
 4}

 5
 6/*服務(wù)的消費者*/
 7class MovieLister
 8{
 9    public Movie[] moviesDirectedBy(String arg) {
10        List allMovies = finder.findAll();
11        for (Iterator it = allMovies.iterator(); it.hasNext();) {
12            Movie movie = (Movie) it.next();
13            if (!movie.getDirector().equals(arg)) it.remove();
14        }

15        return (Movie[]) allMovies.toArray(new Movie[allMovies.size()]);
16    }

17
18    /*消費者內(nèi)部包含一個將指向具體服務(wù)類型的實體對象*/
19    private MovieFinder finder;
20    /*消費者需要在某一個時刻去實例化具體的服務(wù)。這是我們要解耦的關(guān)鍵所在,
21     *因為這樣的處理方式造成了服務(wù)消費者和服務(wù)提供者的強耦合關(guān)系(這種耦合是在編譯期就確定下來的)。
22     **/

23    public MovieLister() {
24        finder = new ColonDelimitedMovieFinder("movies1.txt");
25    }

26}

2.DI的實現(xiàn)方式
   和上面的圖1對應(yīng)的是,如果我們的系統(tǒng)實現(xiàn)了依賴注入,組件間的依賴關(guān)系就變成了圖2:
圖2
說白了,就是要提供一個容器,由容器來完成(1)具體ServiceProvider的創(chuàng)建(2)ServiceUser和ServiceProvider的運行時綁定。下面我們就依次來看一下三種典型的依賴注入方式的實現(xiàn)。特別要說明的是,要理解依賴注入的機制,關(guān)鍵是理解容器的實現(xiàn)方式。本文后面給出的容器參考實現(xiàn),均為黃忠成老師的代碼,筆者僅在其中加上了一些關(guān)鍵注釋而已。

2.1 Constructor Injection(構(gòu)造器注入)
 我們可以看到,在整個依賴注入的數(shù)據(jù)結(jié)構(gòu)中,涉及到的重要的類型就是ServiceUser, ServiceProvider和Assembler三者,而這里所說的構(gòu)造器,指的是ServiceUser的構(gòu)造器。也就是說,在構(gòu)造ServiceUser實例的時候,才把真正的ServiceProvider傳給他:

 

1class MovieLister
2{
3   //其他內(nèi)容,省略
4
5   public MovieLister(MovieFinder finder)
6   {
7       this.finder = finder;
8   }

9}

 

2.2 Setter Injection(設(shè)值注入)
   這種注入方式和構(gòu)造注入實在很類似,唯一的區(qū)別就是前者在構(gòu)造函數(shù)的調(diào)用過程中進行注入,而它是通過給屬性賦值來進行注入。無怪乎PicoContainer和Spring都是同時支持這兩種注入方式。Spring對通過XML進行配置有比較好的支持,也使得Spring中更常使用設(shè)值注入的方式:

 1<beans>
 2    <bean id="MovieLister" class="spring.MovieLister">
 3        <property name="finder">
 4            <ref local="MovieFinder"/>
 5        property>
 6    bean>
 7    <bean id="MovieFinder" class="spring.ColonMovieFinder">
 8        <property name="filename">
 9            <value>movies1.txtvalue>
10        property>
11    bean>
12beans>

2.4  除了DI,還有Service Locator
   上面提到的依賴注入只是消除ServiceUser和ServiceProvider之間的依賴關(guān)系的一種方法,還有另一種方法:服務(wù)定位器(Service Locator)。也就是說,由ServiceLocator來專門負責(zé)提供具體的ServiceProvider。當然,這樣的話ServiceUser不僅要依賴于服務(wù)的接口,還依賴于ServiceContract。仍然是最早提到過的電影列舉器的例子,如果使用Service Locator來解除依賴的話,整個依賴關(guān)系應(yīng)當如下圖所示:
圖3
用起來也很簡單,在一個適當?shù)奈恢茫ū热缭谝唤M相關(guān)服務(wù)即將被調(diào)用之前)對ServiceLocator進行初始化,用到的時候就直接用ServiceLocator返回ServiceProvider實例:

 

1//服務(wù)定位器的初始化
2ServiceLocator locator = new ServiceLocator();
3locator.loadService("MovieFinder"new ColonMovieFinder("movies1.txt"));
4ServiceLocator.load(locator);

5//服務(wù)定義器的使用
6//其實這個使用方式體現(xiàn)了服務(wù)定位器和依賴注入模式的最大差別:ServiceUser需要顯示的調(diào)用ServiceLocator,從而獲取自己需要的服務(wù)對象;
7//而依賴注入則是隱式的由容器完成了這一切。
8MovieFinder finder = (MovieFinder) ServiceLocator.getService("MovieFinder");
9

it知識庫深度理解依賴注入,轉(zhuǎn)載需保留來源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標記有誤,請第一時間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 99re热有精品国产 | 伊人久久大香线蕉综合高清 | 迈开腿让我看下你的小草莓声音 | 亚洲色 图 | 捏揉舔水插按摩师 | 中文字幕亚洲视频 | 凌馨baby| 三级aa久久 | 国内精品视频一区二区在线观看 | 老太婆性BBWBBW | YELLOW高清视频免费观看 | 久久精品视在线观看2 | 一本道久在线综合色色 | 把腿张开再深点好爽宝贝 | 亚洲国产成人精品不卡青青草原 | 扒开双腿疯进出爽爽爽动态图 | 国产AV亚洲精品久久久久 | 看黄色片子 | 日本老人oldmantv乱 | 无码欧美喷潮福利XXXX | 久久re视频这里精品09首页 | 琪琪色原网20岁以下热热色原网站 | 国语自产一区视频 | 亚洲精品无码葡京AV天堂 | 日本大片免a费观看视频 | 成人中文字幕在线观看 | 成人高清护士在线播放 | 麻豆成人AV久久无码精品 | 亚洲成a人片777777久久 | 国产成人无码WWW免费视频在线 | 亚洲综合春色另类久久 | 一个人的视频在线观看免费观看 | 97精品国产亚洲AV高清 | 欧美国产在线一区 | 国产亚洲AV精品无码麻豆 | 男人把女人桶到爽免费看视频 | 美女视频黄色的 | 在线观看免费小视频 | 狼人大香伊蕉国产WWW亚洲 | 亚洲视频免费观看 | 最近中文字幕mv手机免费高清 |