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

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

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

    Chasing an mobile web vision

    闖蕩在移動(dòng)互聯(lián)網(wǎng)的世界中

    OSGi介紹(四)第一個(gè)bundle

    先給出“扶貧助手”的第一種改造,我稱(chēng)之為“直接型”,請(qǐng)看:

    package aa.bb.cc;
    //需要import osgi的核心package
    import org.osgi.framework.BundleActivator;
    import org.osgi.framework.BundleContext;
    //實(shí)現(xiàn)了BundleActivator
    public class FamilyInfo implements BundleActivator {
     
    private String familyName;
     
    private int population;
     
    private int incomePerYear;
     省略了getter和setter方法 
     
    public String toString() {
      
      
    return "Family: " + this.familyName + ", population: " + this.population + ", income: " + this.incomePerYear;
     }

     
     
    public int getIncomePerMember(){
      
    return (int)(this.incomePerYear/this.population);
     }

     
    public static void sortByIncomePerYear(FamilyInfo[] families){
      FamilyInfo temp 
    = null;
      
    for(int i = 0; i < families.length -1; i ++){
       
    for(int j = i + 1; j < families.length; j ++){
        
        
    if(families[i].getIncomePerYear() > families[j].getIncomePerYear()){
         temp 
    = families[i];
         families[i] 
    = families[j];
         families[j] 
    = temp;
        }

       }

      }

      
     }

     
    public static void sortByIncomePerMember(FamilyInfo[] families){
      FamilyInfo temp 
    = null;
      
    for(int i = 0; i < families.length -1; i ++){
       
    for(int j = i + 1; j < families.length; j ++){
        
        
    if(families[i].getIncomePerMember() > families[j].getIncomePerMember()){
         temp 
    = families[i];
         families[i] 
    = families[j];
         families[j] 
    = temp;
        }

       }

      }

      
      
     }

     
    //在framework每次啟動(dòng)該bundle的時(shí)候該方法會(huì)被framework調(diào)用執(zhí)行。
     public void start(BundleContext context) throws Exception {
      FamilyInfo[] families 
    = new FamilyInfo[3];
      families[
    0= new FamilyInfo();
      families[
    0].setFamilyName("Zhang");
      families[
    0].setPopulation(3);
      families[
    0].setIncomePerYear(1200);
      families[
    1= new FamilyInfo();
      families[
    1].setFamilyName("Li");
      families[
    1].setPopulation(6);
      families[
    1].setIncomePerYear(1800);
      families[
    2= new FamilyInfo();
      families[
    2].setFamilyName("Liu");
      families[
    2].setPopulation(4);
      families[
    2].setIncomePerYear(1500);
      FamilyInfo.sortByIncomePerYear(families);
      
    for(int i = 0; i < families.length; i ++){
       System.out.println(families[i].toString());
      }

      FamilyInfo.sortByIncomePerMember(families);
      
    for(int i = 0; i < families.length; i ++){
       System.out.println(families[i].toString());
      }

     }

     
    //在framework停止該bundle時(shí),該方法將被framework調(diào)用
     public void stop(BundleContext context) throws Exception {
     }

    }


    看到代碼的區(qū)別了嗎?我在不同之處都標(biāo)注了注釋。其實(shí),從說(shuō)白了,就是實(shí)現(xiàn)了org.osgi.framework.BundleActivator這個(gè)接口。
    當(dāng)然,細(xì)心的話,你會(huì)發(fā)現(xiàn)這個(gè)bundle沒(méi)有public static void main(String[] args)方法了。那么它怎么被啟動(dòng)呢?這個(gè)就是bundle的奧秘所在。不過(guò),如果你了解java的class loading機(jī)制以及reflection技術(shù),你立馬會(huì)明白這個(gè)bundle的運(yùn)行機(jī)制。這兩項(xiàng)技術(shù)廣泛應(yīng)用于j2ee(對(duì)吧?我得承認(rèn),j2ee的經(jīng)驗(yàn)不多,呵呵)以及java的plugin機(jī)制。
    簡(jiǎn)單說(shuō)來(lái),java.lang.Class這個(gè)類(lèi)有一個(gè)方法:
    public Object newInstance()throws InstantiationException,IllegalAccessException
    針對(duì)上面的“扶貧助手”bundle而言,framework只要通過(guò)ClassLoader找到aa.bb.cc.FamilyInfo.class并加載后,就可以通過(guò)newInstance()方法創(chuàng)建一個(gè)BundleActivator的實(shí)例,然后調(diào)用public void start(BundleContext context)方法,就完成了啟動(dòng)bundle的動(dòng)作了。之后,調(diào)用public
    void stop(BundleContext context)方法來(lái)停止bundle
    如果你接著問(wèn),framework怎么知道這個(gè)bundle里面的BundleActivator是哪個(gè)類(lèi)呢?嗯,問(wèn)到點(diǎn)子上了。這就涉及到下面我們要講的bundle的部署了。在上一篇給出的bundle定義中指出,Jar文件是bundle的唯一格式,也就是說(shuō),我們要運(yùn)行bundle,必須把代碼打成jar文件。而jar文件可以帶有manifest文件,這個(gè)文件對(duì)bundle是不可缺少的。OSGi規(guī)范里面,通過(guò)定義一系列適用于bundle的manifest關(guān)鍵字(bundle manifest header)來(lái)擴(kuò)展manifest文件。
    比如,開(kāi)發(fā)人員在manifest中添加下面一行:
    Bundle-Activator: aa.bb.cc.FamilyInfo
    這樣,在bundle被部署到framework后,framework就可以通過(guò)讀取manifest的關(guān)鍵字來(lái)獲得BundleActivator的具體實(shí)現(xiàn)類(lèi)名,并通過(guò)reflection機(jī)制產(chǎn)生BundleActivator的實(shí)例。
    這里就給出扶貧助手的manifest的一個(gè)例子:

    Manifest-Version: 1.0  
    Bundle-SymbolicName: aa.bb.cc.family //osgi specification 4強(qiáng)制要求的關(guān)鍵字,每個(gè)bundle都必須有唯一的symbolic name
    Bundle-Name: Family Info Manager        //bundle的名稱(chēng)
    Bundle-Version: 
    1.0   //bundle的版本號(hào)
    Bundle-Activator: aa.bb.cc.FamilyInfo   //指明BundleActivator的實(shí)現(xiàn)類(lèi)名
    Import-Package: org.osgi.framework
    ;version=1.3   //列出該bundle需要從其他bundle所引入的
                                                                         //package(s)(提供該package的bundle必須在其
                                                                         //manifest中有Export-Package: 
                                                                         //org.osgi.framework
    ;version=1.3)

    然后我們用jdk自帶的jar工具,來(lái)生成bundle jar文件。這樣,第一個(gè)bundle就完成了,您可以下載一個(gè)開(kāi)源的framework安裝這個(gè)bundle試一試。在framework上嘗試對(duì)該bundle的啟動(dòng)和停止,輸出的結(jié)果應(yīng)該和原先的java application是一樣的,然后您還可以在那個(gè)start(context)的方法中,再增加一條記錄,重新打包,然后通過(guò)framework的update功能,就能夠在不重新啟動(dòng)framework的情況下升級(jí)該bundle,我就暫時(shí)偷懶不針對(duì)具體framework來(lái)給出操作的方法了,先給您自己先摸索了(當(dāng)然您也可以偷懶,因?yàn)楹竺嫖視?huì)結(jié)合具體framework深入講述的)。
    好了,說(shuō)完代碼的改造,再看看改造所帶來(lái)的程序設(shè)計(jì)結(jié)構(gòu)變化:那~~~就~~~~是~~~~沒(méi)變化!因此我把這種原封不動(dòng)的改造方法稱(chēng)為“直接型”,用這種直接法,我們可以輕易的把一個(gè)java應(yīng)用程序改造成bundle。而這種改造目前能看到的好處就是bundle的“熱”升級(jí)。那怎樣能更漂亮些呢?在下一篇中,我會(huì)進(jìn)一步改造這個(gè)扶貧助手成為兩個(gè)bundle,看看bundle的合作將會(huì)帶來(lái)怎樣的精彩效果

    posted on 2006-02-14 15:46 勤勞的蜜蜂 閱讀(5532) 評(píng)論(4)  編輯  收藏

    評(píng)論

    # re: OSGi介紹(四)第一個(gè)bundle 2007-06-21 17:38 hata

    精彩!我看完OSGI實(shí)戰(zhàn)都沒(méi)想過(guò)可以用這種方式生成bundle,輪廓更清晰了,加緊看下一篇,估計(jì)更爽!哇揀到寶咯~呵呵!謝謝大哥的資料!
    還問(wèn)個(gè)問(wèn)題啊,你網(wǎng)頁(yè)中的代碼可以“+”和“-”縮進(jìn)哦,是你自己做的吧?怎么實(shí)現(xiàn)的啊?在別的網(wǎng)都沒(méi)見(jiàn)過(guò)呢,只在IDE上用過(guò),呵呵 :}  回復(fù)  更多評(píng)論   

    # re: OSGi介紹(四)第一個(gè)bundle 2008-01-18 23:40 風(fēng)學(xué)者

    兄弟,看到這里,不得不來(lái)給你獻(xiàn)花.寫(xiě)的很精彩,也通俗易懂,給初學(xué)者很好的指導(dǎo).  回復(fù)  更多評(píng)論   

    # re: OSGi介紹(四)第一個(gè)bundle 2009-04-29 14:43 guest

    繼續(xù)

    我也正在研究,幫了不少忙,謝謝  回復(fù)  更多評(píng)論   

    # re: OSGi介紹(四)第一個(gè)bundle[未登錄](méi) 2009-07-23 16:25 han

    我要轉(zhuǎn)載。。我要轉(zhuǎn)載。。。
    OSGI。。。。太誘人了。。  回復(fù)  更多評(píng)論   


    只有注冊(cè)用戶(hù)登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 免费人成在线观看网站| 亚洲国产综合在线| 亚洲午夜av影院| 午夜亚洲福利在线老司机| 亚洲AV色欲色欲WWW| 亚洲中文字幕无码mv| 精品国产人成亚洲区| 亚洲一区二区三区在线播放| 亚洲欧洲日产国码高潮αv| 亚洲国产精品嫩草影院久久| 日本免费xxxx| 中文字幕乱码一区二区免费| 最新国产乱人伦偷精品免费网站| 免费在线黄色电影| 99久久精品免费视频| 在线视频免费观看爽爽爽| 亚洲免费综合色在线视频| 国产免费网站看v片在线| 精品国产污污免费网站入口| 国精产品一区一区三区免费视频 | 亚洲阿v天堂在线2017免费| 国产一级淫片a免费播放口之| 国产在线观看麻豆91精品免费| 亚洲毛片免费视频| 欧亚精品一区三区免费| 美女内射无套日韩免费播放| 成人免费视频网站www| 成人免费在线观看网站| 最近高清中文字幕无吗免费看| 无码日韩人妻av一区免费| 国产美女做a免费视频软件| 亚洲国产成人精品无码久久久久久综合 | 亚洲午夜无码久久| 国产精品久久久久久亚洲小说| 一日本道a高清免费播放| 日本免费电影一区二区| 国产四虎免费精品视频| 麻豆国产人免费人成免费视频| 男女免费观看在线爽爽爽视频 | 亚洲AV无码资源在线观看| 亚州**色毛片免费观看|