guangnian0412's BLOG

          Java in my life

          常用鏈接

          統(tǒng)計(jì)

          積分與排名

          我關(guān)注的Blog

          最新評(píng)論

          Eclipse RCP與Spring的整合

          ??? Eclipse RCP與Spring的整合

          ??? 最近上一個(gè)項(xiàng)目想在Eclipse RCP中使用Spring,在網(wǎng)上Google了一下發(fā)現(xiàn)這方面的資料比較少,知道Spring自己有個(gè)Spring-OSGI的項(xiàng)目,可以在Spring中配置OSGI服務(wù)。可是,我只是想在RCP中引入Spring來管理Java Bean,不想去研究那個(gè)東西。于是,看看有沒有什么簡(jiǎn)單的方法來解決這個(gè)問題。在陳剛的BlOG中找到了問題的部分答案。
          ??????
          ??????? 于是,我在RCP項(xiàng)目的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中有詳細(xì)的說明,是一個(gè)獲得項(xiàng)目絕對(duì)路徑的方法。另外在陳剛的BLOG中提到了,在Eclipse 3.2M6中已經(jīng)不需要轉(zhuǎn)換ClassLoader。但是,我用的是3.2 release版,還是需要轉(zhuǎn)換ClassLoader才能正常工作啊。覺得這并不像陳剛所說的BUG,Eclipse的每個(gè)Plugin都有自己的ClassLoader,所以需要轉(zhuǎn)換吧。

          ??? 然后,在start方法中調(diào)用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?????}

          這樣我們?cè)谄渌胤骄涂梢杂?/span>
          Activator.getDefault().getApplicationContext()得到ApplicationContext了。

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

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

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

          ?????? 然后,我們要?jiǎng)?chuàng)建一個(gè)Extension Factory來在RCP中注冊(cè)這個(gè)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。

          ????? 最后,我們要用這個(gè)
          MyViewExtensionFactory來注冊(cè)擴(kuò)展點(diǎn),如下:

          <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

          ? ? ?? 好,已經(jīng)大功告成。MyView已經(jīng)成功的進(jìn)入了Spring框架的管理。其他的RCP擴(kuò)展點(diǎn)也可以如此炮制。 ???????????

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

          評(píng)論

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

          想請(qǐng)教一下:

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

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

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

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

          private static AbstractUIPlugin plugin = AdminConsolePlugin.getDefault();

          private ProjectUtil() {}
          .....  回復(fù)  更多評(píng)論   

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

          我現(xiàn)在的問題,是在rcp中取ctx,失敗。  回復(fù)  更多評(píng)論   

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

          同樓上,我在測(cè)試main中可以利用ApplicationContext,但在RCP View中卻不能使用,總是報(bào)錯(cuò):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數(shù)據(jù)庫(kù)中共有"+ warrantData.getAllWarrants().size()+"條記錄");
          }  回復(fù)  更多評(píng)論   

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

          請(qǐng)達(dá)人賜教,謝謝!  回復(fù)  更多評(píng)論   

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

          http://dcbjavaeye.javaeye.com/admin/blogs/351449  回復(fù)  更多評(píng)論   

          主站蜘蛛池模板: 嵊泗县| 五寨县| 长宁县| 新闻| 浮山县| 富川| 开化县| 四会市| 阿拉善左旗| 合作市| 邹城市| 确山县| 嵩明县| 香格里拉县| 江源县| 南丰县| 武义县| 大城县| 昔阳县| 鸡西市| 长丰县| 阿拉善盟| 乌恰县| 九龙县| 明溪县| 商洛市| 大悟县| 保定市| 兴仁县| 漳平市| 炉霍县| 门头沟区| 谢通门县| 鞍山市| 武隆县| 剑川县| 麻阳| 沈阳市| 丽水市| 汶上县| 上杭县|