<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    瘋狂

    STANDING ON THE SHOULDERS OF GIANTS
    posts - 481, comments - 486, trackbacks - 0, articles - 1
      BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    apache discovery

    Posted on 2010-09-04 11:34 瘋狂 閱讀(675) 評論(0)  編輯  收藏 所屬分類: java apache項目

    轉(zhuǎn)載:http://terrencexu.javaeye.com/blog/715982

    Discovery組件被用以查找可插拔接口的實現(xiàn)實例,它提供了一種通用的實例化這些實現(xiàn)的方式,而且可以管理單例(工廠)的生命周期。本質(zhì)上來講,就是定位那些實現(xiàn)了給定Java接口的類,并實例化。除此之外,Discovery還可以用以在給定的classpath中查找并加載資源文件。

     

    Discovery組件在查找所有的實現(xiàn)類的時候需要預(yù)先將允許被查找的實現(xiàn)類配置到默認(rèn)的配置文件中,默認(rèn)的配置文件為:

    /META-INF/services/<YOUR Interface whole name including pkg name>, Discovery將依次加載該文件中配置的允許加載的實現(xiàn)類。

     

    下面將舉例說明:

    首先定義一個Interface:Action

    Java代碼 復(fù)制代碼
    1. package com.javaeye.terrencexu.discovery;   
    2.   
    3. public interface Action {   
    4.   
    5.     public String getName();   
    6.        
    7. }  

     

    然后在不同的包里分別實現(xiàn)Action接口,如下(請注意包名)

    Java代碼 復(fù)制代碼
    1. package com.javaeye.terrencexu.discovery.impl;   
    2.   
    3. import com.javaeye.terrencexu.discovery.Action;   
    4.   
    5. public class CreateAction implements Action {   
    6.   
    7.     @Override  
    8.     public String getName() {   
    9.         return "Create Action";   
    10.     }   
    11.   
    12. }  

     

    Java代碼 復(fù)制代碼
    1. package com.javaeye.terrencexu.discovery.impl;   
    2.   
    3. import com.javaeye.terrencexu.discovery.Action;   
    4.   
    5. public class DeleteAction implements Action {   
    6.   
    7.     @Override  
    8.     public String getName() {   
    9.         return "Delete Action";   
    10.     }   
    11.   
    12. }  

     

    Java代碼 復(fù)制代碼
    1. package com.javaeye.terrencexu.discovery.impl2;   
    2.   
    3. import com.javaeye.terrencexu.discovery.Action;   
    4.   
    5. public class AddAction implements Action {   
    6.   
    7.     @Override  
    8.     public String getName() {   
    9.         return "Add Action";   
    10.     }   
    11.   
    12. }  

     

    Java代碼 復(fù)制代碼
    1. package com.javaeye.terrencexu.discovery.impl2;   
    2.   
    3. import com.javaeye.terrencexu.discovery.Action;   
    4.   
    5. public class RemoveAction implements Action {   
    6.   
    7.     @Override  
    8.     public String getName() {   
    9.         return "Remove Action";   
    10.     }   
    11.   
    12. }  

     

    接下來將定義配置文件,按序定義允許被加載的實現(xiàn)類,該文件默認(rèn)存在位置為/META-INF/services/,文件名為com.javaeye.terrencexu.discovery.Action,文件內(nèi)容如下:

    Java代碼 復(fù)制代碼
    1. # Display in order   
    2.   
    3. com.javaeye.terrencexu.discovery.impl.CreateAction   
    4. com.javaeye.terrencexu.discovery.impl.DeleteAction   
    5. com.javaeye.terrencexu.discovery.impl2.AddAction  

     

    這樣所有的準(zhǔn)備材料就都已經(jīng)齊全了,接下來可以驗證一把了,如下:

    Java代碼 復(fù)制代碼
    1.  /**  
    2.  *  CreateAction/DeleteAction/AddAction have been defined in /META-INF/services/com.javaeye.terrencexu.discovery.Action  
    3.  *    
    4.  *  And the order is CreateAction > DeleteAction > AddAction  
    5.  */  
    6. @SuppressWarnings("unchecked")   
    7. public void testGetAllProviders() {   
    8.     String[] expectedResults = new String[] {"Create Action""Delete Action""Add Action"};   
    9.            
    10.     Enumeration<Action> enu = Service.providers(Action.class);   
    11.   
    12.     int count = 0;   
    13.     while (enu.hasMoreElements()) {   
    14.         Action action = enu.nextElement();   
    15.         assertTrue("The action name should be \"" + expectedResults[count] + "\", but actually is \"" + action.getName() + "\"",    
    16.                action.getName().equals(expectedResults[count]));   
    17.         count ++;   
    18.     }   
    19.            
    20.     assertEquals(count, expectedResults.length);   
    21. }  

     

    可以發(fā)現(xiàn),因為RemoveAction沒有被配置到service文件中,所以將不會被加載,另外一點兒就是,配置文件中的定義順序即加載順序。

     

    除此之外,Discovery提供了singleton模式加載唯一實現(xiàn),并且該實現(xiàn)將被緩存在cache中,除非通過顯示的調(diào)用release()方法釋放緩存,否則所有之后的調(diào)用,都將返回初次調(diào)用加載的Action。

    Java代碼 復(fù)制代碼
    1. public void testFindCreateAction() {   
    2.     try {   
    3.         // Load provider com.javaeye.terrencexu.discovery.impl.CreateAction   
    4.         Action createAction = (Action) DiscoverSingleton.find(Action.class, CreateAction.class.getName());   
    5.         assertEquals("Create Action", createAction.getName());   
    6.     } finally {   
    7.         DiscoverSingleton.release();   
    8.     }   
    9. }  

     

     

    還有一點需要說明的是,如果定義了默認(rèn)的service文件,無論通過singleton模式加載的實現(xiàn)類有沒有被配置在service文件中,都將默認(rèn)加載配置中文中的第一個Action,比如上文中的CreateAction。

    Java代碼 復(fù)制代碼
    1. public void testFindDeleteActionInConfig() {   
    2.     try {   
    3.         // Load provider com.javaeye.terrencexu.discovery.impl.CreateAction   
    4.         Action deleteAction = (Action) DiscoverSingleton.find(Action.class, DeleteAction.class.getName());   
    5.            
    6.         // As the default configuration file defines the CreateAction as the first element, so you will always get the CreateAction as singleton.    
    7.         assertEquals("Create Action", deleteAction.getName());   
    8.     } finally {   
    9.         DiscoverSingleton.release();   
    10.     }   
    11. }  

     

    那么如果必須使用service文件,又想通過singleton模式加載某特定的實現(xiàn)類該怎么辦呢?可以通過傳遞Properties到DiscoverSingleton中去改變它的行為,如下:

    Java代碼 復(fù)制代碼
    1. public void testFindDeleteActionWithProperty() {   
    2.     try {   
    3.         Properties props = new Properties();   
    4.         props.setProperty(Action.class.getName(), DeleteAction.class.getName());   
    5.            
    6.         // Load provider com.javaeye.terrencexu.discovery.impl.CreateAction   
    7.         Action deleteAction = (Action) DiscoverSingleton.find(Action.class, props);   
    8.         assertEquals("Delete Action", deleteAction.getName());   
    9.     } finally {   
    10.         DiscoverSingleton.release();   
    11.     }   
    12. }  

     

    除了加載類之外,很多情況下我們還想加載資源文件,比如在你的classpath下有一個配置文件為/conf/testResource,下面我們通過Discovery去加載該資源文件:

    Java代碼 復(fù)制代碼
    1. public void testFindResources() {   
    2.     ClassLoaders loaders = new ClassLoaders();   
    3.     ClassLoader cl = getClass().getClassLoader();   
    4.     if(cl != null) {   
    5.         loaders.put(getClass().getClassLoader(), true);   
    6.     } else {   
    7.         loaders.put(JDKHooks.getJDKHooks().getSystemClassLoader(), true);   
    8.     }   
    9.        
    10.     String name = "conf/testResource";   
    11.     DiscoverResources discovery = new DiscoverResources(loaders);   
    12.     ResourceIterator iter = discovery.findResources(name);   
    13.        
    14.     while(iter.hasNext()) {   
    15.         Resource resource = iter.nextResource();   
    16.         URL url = resource.getResource();   
    17.         System.out.println(url);   
    18.     }   
    19. }  

     

    Discovery還有其他一些功能這里就不在詳細(xì)的一一贅述了,可以參考http://commons.apache.org/discovery/index.html進(jìn)一步詳細(xì)了解。

     

    下圖是我的例子的目錄結(jié)構(gòu),僅供參考:


    然后附件中有source code,僅供參考。


     

    主站蜘蛛池模板: 国产精品亚洲二区在线观看| 永久免费观看的毛片的网站| 亚洲av无码成人精品区在线播放| 亚洲日日做天天做日日谢| 亚洲免费网站在线观看| 亚洲综合色一区二区三区小说| 日本一区二区免费看| 久久青青草原亚洲AV无码麻豆| 中文在线日本免费永久18近| 亚洲精品高清国产一线久久| a色毛片免费视频| 久久精品国产亚洲一区二区| 暖暖免费在线中文日本| 久久久久亚洲Av无码专| 国内免费高清在线观看| 色综合久久精品亚洲国产| 国产精品免费看久久久无码| 免费无遮挡无码视频在线观看| 亚洲人成无码久久电影网站| 丝袜足液精子免费视频| 无码久久精品国产亚洲Av影片| 4虎1515hh永久免费| 亚洲人成图片网站| 免费99热在线观看| 热久久这里是精品6免费观看| 97se亚洲综合在线| 免费一本色道久久一区| 特色特黄a毛片高清免费观看| 亚洲国产成人片在线观看无码| 亚洲精品在线免费看| 亚洲日本va一区二区三区| 免费又黄又爽又猛的毛片| 国产线视频精品免费观看视频| 亚洲综合亚洲国产尤物| 永久免费av无码网站大全| 国产vA免费精品高清在线观看| 亚洲色欲www综合网| 国产在线观看免费不卡| 成全视频高清免费观看电视剧| 麻豆狠色伊人亚洲综合网站 | 狠狠热精品免费观看|