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

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

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

    guangnian0412's BLOG

    Java in my life

    常用鏈接

    統計

    積分與排名

    我關注的Blog

    最新評論

    Eclipse RCP與Spring的整合

    ??? Eclipse RCP與Spring的整合

    ??? 最近上一個項目想在Eclipse RCP中使用Spring,在網上Google了一下發現這方面的資料比較少,知道Spring自己有個Spring-OSGI的項目,可以在Spring中配置OSGI服務。可是,我只是想在RCP中引入Spring來管理Java Bean,不想去研究那個東西。于是,看看有沒有什么簡單的方法來解決這個問題。在陳剛的BlOG中找到了問題的部分答案。
    ??????
    ??????? 于是,我在RCP項目的activator class中加入了

    ?1 ? ? private?ApplicationContext?ctx;
    ?2?
    ?3???? private?void?initializeApplicationContext()?{
    ?4?????????ClassLoader?oldLoader?=?Thread.currentThread().getContextClassLoader();
    ?5?????????try{
    ?6?????????????Thread.currentThread().setContextClassLoader(getDefault().getClass().getClassLoader());
    ?7?????????????this.ctx?=?new?FileSystemXmlApplicationContext(ProjectUtil.toFullPath("properties/applicationContext.xml"));
    ?8?????????}?finally?{
    ?9?????????????Thread.currentThread().setContextClassLoader(oldLoader);
    10?????????}
    11?????}

    ProjectUtil.toFullPath()方法在陳剛的BLOG中有詳細的說明,是一個獲得項目絕對路徑的方法。另外在陳剛的BLOG中提到了,在Eclipse 3.2M6中已經不需要轉換ClassLoader。但是,我用的是3.2 release版,還是需要轉換ClassLoader才能正常工作啊。覺得這并不像陳剛所說的BUG,Eclipse的每個Plugin都有自己的ClassLoader,所以需要轉換吧。

    ??? 然后,在start方法中調用initializeApplicationContext方法,并為
    ctx提供getter

    1?????public?void?start(BundleContext?context)?throws?Exception?{
    2?????????super.start(context);
    3?????????initializeApplicationContext();
    4?????}
    5?
    6?????public?ApplicationContext?getApplicationContext()?{
    7?????????return?this.ctx;
    8?????}

    這樣我們在其他地方就可以用
    Activator.getDefault().getApplicationContext()得到ApplicationContext了。

    ??????? 但是,新的問題又來了,如何把RCP中的組件也納入Spring的管理呢,比如ViewPart。我又Google了一下,在今年的TSE2006上有一場報告就提到了Spring同Eclipse RCP的整合 ,里面提到了利用Eclipse的? ?? IExecutableExtensionFactory和IExecutableExtension接口,確實非常的簡單。
    ? ? ? ? 通常,我們自己定義的ViewPart是通過擴展點
    org.eclipse.ui.views,由Eclipse的Workbench自動創建,像這樣:

    <extension?point="org.eclipse.ui.views">
    <view
    ????????? name="myView"
    ????????? class
    ="org.eclipse.example.rcpspring.MyView"
    ????????? id
    ="org.eclipse.example.rcpspring.view">
    </view>
    </extension>
    ?????
    ?????? 現在我們通過Spring來管理這個view,并假設為其注入一個businessService Bean,像這樣:

    <bean?id="myView" class="org.eclipse.example.rcpspring.MyView">
    <property?name="businessService" ref="businessService"/>
    </bean>

    ?????? 然后,我們要創建一個Extension Factory來在RCP中注冊這個view,代碼如下:

    ?1?public?class?MyViewExtensionFactory?implements?IExecutableExtensionFactory,
    ?2?????????IExecutableExtension?{
    ?3?????private?ViewPart?view;
    ?4?
    ?5?????public?Object?create()?throws?CoreException?{
    ?6?????????return?this.view;
    ?7?????}
    ?8?
    ?9?????public?void?setInitializationData(IConfigurationElement?config,
    10?????????????String?propertyName,?Object?data)?throws?CoreException?{
    11?????????this.view?=?(MyView)Activator.getDefault().getApplicationContext().getBean("myView");
    12?????????this.view.setInitializationData(config,?propertyName,?data);
    13?????}
    14?}

    通過
    Activator.getDefault().getApplicationContext()來取出上面建立的ApplicationContext。

    ????? 最后,我們要用這個
    MyViewExtensionFactory來注冊擴展點,如下:

    <extension?point="org.eclipse.ui.views">
    <view
    name="myView"
    class
    ="org.eclipse.example.rcpspring.MyViewExtensionFactory"
    id
    ="org.eclipse.example.rcpspring.view">
    </view>
    </extension>

    MyViewExtensionFactory 來取代原來的MyView

    ? ? ?? 好,已經大功告成。MyView已經成功的進入了Spring框架的管理。其他的RCP擴展點也可以如此炮制。 ???????????

    posted on 2006-12-30 21:11 guangnian 閱讀(5595) 評論(5)  編輯  收藏 所屬分類: JAVA其他

    評論

    # re: Eclipse RCP與Spring的整合 2008-06-19 15:24 win

    想請教一下:

    "ProjectUtil.toFullPath()方法在陳剛的BLOG中有詳細的說明,是一個獲得項目絕對路徑的方法。"

    ----->ProjectUtil中的AdminConsolePlugin是什么?是他自己寫的類,還是公用開源包中的類?
    我不理解這兩個地方:
    1>import com.wxxr.management.admin.console.AdminConsolePlugin;
    2> private static AbstractUIPlugin plugin = AdminConsolePlugin.getDefault();

    所以我用不了這種方法。
    我的目的,是想在rcp中使用spring,hibernate.
    我在application方式下,可以成功用hibernate從數據庫中取值,但是,一放入rcp中的button中,就失敗。
    所以,看了你的文章以及陳剛的文章,但是,不明白以上的兩個地方,是什么?
    不管有沒有回復,都感謝:)
    ----------------------------------------------
    .......
    import com.wxxr.management.admin.console.AdminConsolePlugin;

    /**
    * 用于插件項目和非插件項目,提供兩者通用的方法接口
    * @author chengang 2006-3-30
    */
    public class ProjectUtil {

    private static AbstractUIPlugin plugin = AdminConsolePlugin.getDefault();

    private ProjectUtil() {}
    .....  回復  更多評論   

    # re: Eclipse RCP與Spring的整合 2008-06-19 15:25 win

    我現在的問題,是在rcp中取ctx,失敗。  回復  更多評論   

    # re: Eclipse RCP與Spring的整合 2008-08-31 23:38 zwy

    同樓上,我在測試main中可以利用ApplicationContext,但在RCP View中卻不能使用,總是報錯:Error creating the view.Reason:org/springframework/context/ApplicationContext.

    public static void main(String[] args) {

    ApplicationContext context = new ClassPathXmlApplicationContext("invoker-client.xml");
    IWarrantService service = (IWarrantService)context.getBean("warrantServiceProxy");
    warrantData.setContext(context);
    warrantData.setService(service);

    System.out.println("Oracle數據庫中共有"+ warrantData.getAllWarrants().size()+"條記錄");
    }  回復  更多評論   

    # re: Eclipse RCP與Spring的整合 2008-08-31 23:39 zwy

    請達人賜教,謝謝!  回復  更多評論   

    # re: Eclipse RCP與Spring的整合 2009-03-23 21:54 dcb

    http://dcbjavaeye.javaeye.com/admin/blogs/351449  回復  更多評論   

    主站蜘蛛池模板: 亚洲精品色播一区二区| 免费观看的a级毛片的网站| 国产亚洲精品免费| 亚洲人成人网毛片在线播放| 亚洲第一极品精品无码久久| 亚洲av无码成人精品区在线播放| 成年女人午夜毛片免费看| 8x8x华人永久免费视频| 美女在线视频观看影院免费天天看| 高潮内射免费看片| 在线亚洲v日韩v| 亚洲精品av无码喷奶水糖心| 亚洲一区二区三区深夜天堂| 亚洲视频免费观看| 亚洲国产人成网站在线电影动漫 | 又爽又高潮的BB视频免费看| 日韩国产免费一区二区三区| 久久久久久国产精品免费免费男同| a在线视频免费观看在线视频三区| 国产成人va亚洲电影| 亚洲а∨精品天堂在线| 亚洲码欧美码一区二区三区| 中文字幕乱码亚洲精品一区| 亚洲一级免费毛片| 亚洲一区二区三区久久| 亚洲国产av美女网站| 亚洲三级在线播放| 中中文字幕亚洲无线码| 亚洲av乱码一区二区三区香蕉| 亚洲国产精品美女| 亚洲成a人片毛片在线| 亚洲成av人片不卡无码| 亚洲一级毛片免观看| 日本亚洲免费无线码| 亚洲乱人伦中文字幕无码| 亚洲AV无码一区二区三区牲色| 亚洲av无码av在线播放| 免费人成视频在线播放| 国产精品美女久久久免费| 成全视频在线观看免费| 香蕉免费一区二区三区|