三. 把Spring Remoting添加到你的应用程序
下面,我们把Spring添加到你的Eclipse丰富的客户端以便它向前一篇文章中的StockTradeServer工程发出请求。
首先,当开发Eclipse插件/RCP应用程序时,添加第三方库的推荐的方法是通过另外一个插件。这样做以后,你就不需要把这些第三方jars添加到你创建的每个工程。而是,你仅建立你的插件/RCP工程和第三方库工程之间的某种依赖性。首先,我们假定你熟悉Eclipse的classloader。要点是,你必须采取一些额外的步骤来确保你的类在插件依赖性之间能够彼此找到对方:
1. 在Eclipse中创建一个新的插件工程。并命名这个新工程为SpringClient。然后,设置如下值:
在填充Plug-in属性后,点击Finish。对于SpringClient插件工程,你不需要任何模板,因为其主要目的是存储Spring库和任何Spring相关的服务类。
2. 在你的解压的spring-framework-1.2.8发行包中,你会找到下列jar文件:
·spring-aop.jar-在文件夹dist下
·spring-beans.jar-在文件夹dist下
·spring-context.jar-在文件夹dist下
·spring-core.jar-在文件夹dist下
·spring-remoting.jar-在文件夹dist下
·commons-logging.jar-在文件夹lib\jakarta-commons下
·log4j-1.2.13.jar-在文件夹lib\log4j下
然后,把它们全部复制到你的SpringClient根目录下。
3. 在Eclipse的包资源管理器中,右击SpringClient以打开工程属性。选择"Java Build Path",点击"Libraries"选项卡,并且把刚才你通过按钮"Add JARs"添加的所有的那些jar文件加入。请确保你也导入了这些库!点击"Order and Export"选项卡,并且检查所有的库(见图9)。通过这样做,你就可以确保,当你创建对SpringClient的一种工作依赖性时,spring和log jars也是可用的。此后,点击OK。
4. 现在,你要修改SpringClient的manifest。在包资源管理器中,展开SpringClient->META-INF并且打开MANIFEST.MF。点击"Runtime"选项卡并且点击Classpath部分的"Add"。全选Spring jars和logging jars并且点击OK。现在,在"Exported Packages"节中,点击Add。选择所有的包以便导出,并点击OK(见图10)。
我以前提及过,Eclipse的classloader经常引起问题。为了补救这一点,你可以点击MANIFEST.MF选项卡并且添加下面一行:
Eclipse-BuddyPolicy: registered
5. 现在,让我们添加spring配置文件。在Package Explorer中,转到src目录,创建一个新文件applicationContext.xml,并且加入下列内容:
在src目录下,另外创建一个新文件beanRefFactory.xml并且加入下列内容:
不必感到惊讶,这些配置文件与你对stocktradeserver工程进行单元测试时使用的spring配置文件是相同的,除了你重命名了applicationContext.xml以外。
6. 为了简化问题,你可以把类从stocktradeserver工程复制到SpringClient的src目录下。在SpringClient的src目录下面,创建包stephenlum.services.stock和stephenlum.services.stock.dto。
如果你还没有准备好,你可以下载本文源码或参考我的前一篇文章并且复制stephenlum.services.stock下的类StockService.java。然后,复制在stephenlum.services.stock.dto下的类StockDTO.java(见图11)。
7. 把代码添加到类SpringClientPlugin以装载Spring的应用程序上下文。注意,你要把该代码添加到构造器中。下面是新的SpringClientPlugin类:
8. 最后,添加依赖性以实现工程EclipseTradeClient依赖于你的新插件工程SpringClient。在工程EclipseTradeClient中,打开plugin.xml并且点击"Dependencies"选项卡。在"Required Plug-ins"节中,点击Add,选择"SpringClient(1.0.0)",并且点击OK(见图12)。
现在,你必须在EclipseTradeClient manifest文件中添加与Eclipse的伙伴策略相关的内容。在文件plugin.xml中,点击MANIFEST.MF选项卡并且添加下列入口:
Eclipse-RegisterBuddy: SpringClient
下面,我们把Spring添加到你的Eclipse丰富的客户端以便它向前一篇文章中的StockTradeServer工程发出请求。
首先,当开发Eclipse插件/RCP应用程序时,添加第三方库的推荐的方法是通过另外一个插件。这样做以后,你就不需要把这些第三方jars添加到你创建的每个工程。而是,你仅建立你的插件/RCP工程和第三方库工程之间的某种依赖性。首先,我们假定你熟悉Eclipse的classloader。要点是,你必须采取一些额外的步骤来确保你的类在插件依赖性之间能够彼此找到对方:
1. 在Eclipse中创建一个新的插件工程。并命名这个新工程为SpringClient。然后,设置如下值:
ID = SpringClient
Class = springClient.SpringClientPlugin |
在填充Plug-in属性后,点击Finish。对于SpringClient插件工程,你不需要任何模板,因为其主要目的是存储Spring库和任何Spring相关的服务类。
2. 在你的解压的spring-framework-1.2.8发行包中,你会找到下列jar文件:
·spring-aop.jar-在文件夹dist下
·spring-beans.jar-在文件夹dist下
·spring-context.jar-在文件夹dist下
·spring-core.jar-在文件夹dist下
·spring-remoting.jar-在文件夹dist下
·commons-logging.jar-在文件夹lib\jakarta-commons下
·log4j-1.2.13.jar-在文件夹lib\log4j下
然后,把它们全部复制到你的SpringClient根目录下。
3. 在Eclipse的包资源管理器中,右击SpringClient以打开工程属性。选择"Java Build Path",点击"Libraries"选项卡,并且把刚才你通过按钮"Add JARs"添加的所有的那些jar文件加入。请确保你也导入了这些库!点击"Order and Export"选项卡,并且检查所有的库(见图9)。通过这样做,你就可以确保,当你创建对SpringClient的一种工作依赖性时,spring和log jars也是可用的。此后,点击OK。
4. 现在,你要修改SpringClient的manifest。在包资源管理器中,展开SpringClient->META-INF并且打开MANIFEST.MF。点击"Runtime"选项卡并且点击Classpath部分的"Add"。全选Spring jars和logging jars并且点击OK。现在,在"Exported Packages"节中,点击Add。选择所有的包以便导出,并点击OK(见图10)。
我以前提及过,Eclipse的classloader经常引起问题。为了补救这一点,你可以点击MANIFEST.MF选项卡并且添加下面一行:
Eclipse-BuddyPolicy: registered
5. 现在,让我们添加spring配置文件。在Package Explorer中,转到src目录,创建一个新文件applicationContext.xml,并且加入下列内容:
在src目录下,另外创建一个新文件beanRefFactory.xml并且加入下列内容:
不必感到惊讶,这些配置文件与你对stocktradeserver工程进行单元测试时使用的spring配置文件是相同的,除了你重命名了applicationContext.xml以外。
6. 为了简化问题,你可以把类从stocktradeserver工程复制到SpringClient的src目录下。在SpringClient的src目录下面,创建包stephenlum.services.stock和stephenlum.services.stock.dto。
如果你还没有准备好,你可以下载本文源码或参考我的前一篇文章并且复制stephenlum.services.stock下的类StockService.java。然后,复制在stephenlum.services.stock.dto下的类StockDTO.java(见图11)。
7. 把代码添加到类SpringClientPlugin以装载Spring的应用程序上下文。注意,你要把该代码添加到构造器中。下面是新的SpringClientPlugin类:
package springClient;
import org.eclipse.jface.resource.ImageDescriptor; import org.eclipse.ui.plugin.AbstractUIPlugin; import org.osgi.framework.BundleContext; import org.springframework.beans.factory.BeanFactory; import org.springframework.beans.factory.access.BeanFactoryLocator; import org.springframework.beans.factory.access.BeanFactoryReference; import org.springframework.beans.factory.access.SingletonBeanFactoryLocator; /** *应用于桌面的主插件类。 */ public class SpringClientPlugin extends AbstractUIPlugin { private BeanFactory beanFactory; //共享实例. private static SpringClientPlugin plugin; /** *构造器. */ public SpringClientPlugin() { plugin = this; BeanFactoryLocator beanFactoryLocator = SingletonBeanFactoryLocator.getInstance(); BeanFactoryReference beanFactoryReference = beanFactoryLocator.useBeanFactory("ctx"); beanFactory = beanFactoryReference.getFactory(); } /** *在插件激活时调用这个方法 */ public void start(BundleContext context) throws Exception { super.start(context); } /** *当停止插件时,调用这个方法 */ public void stop(BundleContext context) throws Exception { super.stop(context); plugin = null; } /** *返回共享实例. */ public static SpringClientPlugin getDefault() { return plugin; } /** *返回在给定的插件相对路径下的图像文件的一个图像描述符 * @param path-路径 * @返回图像描述符 */ public static ImageDescriptor getImageDescriptor(String path) { return AbstractUIPlugin.imageDescriptorFromPlugin("SpringClient", path); } public BeanFactory getBeanFactory() { return beanFactory; } } |
8. 最后,添加依赖性以实现工程EclipseTradeClient依赖于你的新插件工程SpringClient。在工程EclipseTradeClient中,打开plugin.xml并且点击"Dependencies"选项卡。在"Required Plug-ins"节中,点击Add,选择"SpringClient(1.0.0)",并且点击OK(见图12)。
现在,你必须在EclipseTradeClient manifest文件中添加与Eclipse的伙伴策略相关的内容。在文件plugin.xml中,点击MANIFEST.MF选项卡并且添加下列入口:
Eclipse-RegisterBuddy: SpringClient