Eclipse RCP与Spring的整合 - guangnian0412‘s BLOG ...
来源:百度文库 编辑:神马文学网 时间:2024/04/27 12:29:37
最近上一个项目想在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自动创建,像这样:
name="myView"
class="org.eclipse.example.rcpspring.MyView"
id="org.eclipse.example.rcpspring.view">
现在我们通过Spring来管理这个view,并假设为其注入一个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来注册扩展点,如下:
name="myView"
class="org.eclipse.example.rcpspring.MyViewExtensionFactory"
id="org.eclipse.example.rcpspring.view">
用MyViewExtensionFactory 来取代原来的MyView 。
好,已经大功告成。MyView已经成功的进入了Spring框架的管理。其他的RCP扩展点也可以如此炮制。
于是,我在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自动创建,像这样:
class="org.eclipse.example.rcpspring.MyView"
id="org.eclipse.example.rcpspring.view">
现在我们通过Spring来管理这个view,并假设为其注入一个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来注册扩展点,如下:
class="org.eclipse.example.rcpspring.MyViewExtensionFactory"
id="org.eclipse.example.rcpspring.view">
用MyViewExtensionFactory 来取代原来的MyView 。
好,已经大功告成。MyView已经成功的进入了Spring框架的管理。其他的RCP扩展点也可以如此炮制。
Eclipse RCP与Spring的整合 - guangnian0412‘s BLOG ...
spring与Ajax的整合
eclipse RCP:Rich?Client的新选择
整合Struts2与Spring的步骤(转)
整合Struts2与Spring的步骤assas
拥抱Eclipse RCP
Eclipse RCP开发类书籍
拥抱Eclipse RCP
整合tomcat与apache的一点心得 - 踏月远航||kevin‘s blog
Hibernate3与spring的整合应用-技术学习者
Struts2与Spring、Hibernate三者整合的过程示例*
Struts2与Spring、Hibernate三者整合的过程
Struts2与Spring Hibernate三者整合的过程示例
用 Spring 更好地处理 Struts 动作三种整合 Struts 应用程序与 Spring 的方式
使用 Spring 更好地处理 Struts 动作三种整合 Struts 应用程序与 Spring 的方式
spring和ibatis的整合
如何发布eclipse rcp产品
When to use Eclipse RCP?
Struts2与Spring、Hibernate三者整合
Eclipse平台架构技术分析及基于RCP的应用研究
spring和ibatis的整合1
Struts and Spring的整合总结
spring和ibatis的整合2
Spring与ActiveMQ(JMS)的整合说明 : 姓张的小子