本文介绍如何利用Eclipse插件Spring IDE在Eclipse中的使用。
Eclipse是目前非常流行的开发平台,开放扩展的架构让很多程序员找到了自己个性化的工作环境。 问题提出: 在采用Spring框架进行系统开发时,Bean的配置文件XML的书写、XML文件的内容校验及Bean之间的依赖关系查看等工作,如果能够采用合适的工具来完成,会成倍提高开发效率。 解决方法: Spring IDE是Spring官方网站推荐的Eclipse插件,可提供在开发Spring时对Bean定义文件进行验证并以可视化的方式查看各个Bean之间的依赖关系等。 同时,建议结合Eclipse XMLBuddy插件进行XML文件编辑与校验,是个不错的选择。 安装说明 JDK:1.5.0 从 http://java.sun.com上去下载安装 Eclipse:3.1.2 从 http://www.eclipse.org 上去下载解压 Spring 1.2.8 从 http://www.springframework.org 上去下载解压 Spring IDE 1.3.2 从 http://springide.org 上去下载 XMLBuddy 2.0.72 从 http://www.xmlbuddy.com/ 上去下载 Spring IDE 1.3.2 Update地址为: http://springide.org/updatesite/ 管理技巧 提示:新下载的插件PlugIn一定不要都放在原始的Eclipse目录下去,一大堆,累死你:(
确认安装 spring-core.jar需commons-collections.jar,spring-core.jar是以下其它各个的基本。 spring-beans.jar需spring-core.jar/cglib-nodep-2.1_3.jar spring-aop.jar需spring-core.jar/spring-beans.jar/cglib-nodep-2.1_3.jar/aopalliance.jar spring-context.jar需 spring-core.jar/spring-beans.jar/spring-aop.jar/commons-collections.jar/aopalliance.jar spring-dao.jar需spring-core.jar/spring-beans.jar/spring-aop.jar/spring-context.jar spring-jdbc.jar需spring-core.jar/spring-beans.jar/spring-dao.jar spring-web.jar需spring-core.jar/spring-beans.jar/spring-context.jar spring-webmvc.jar需spring-core.jar/spring-beans.jar/spring-context.jar/spring-web.jar spring-hibernate.jar需 spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-jdbc.jar/spring-orm.jar/spring-web.jar/spring-webmvc.jar spring-orm.jar需 spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-jdbc.jar/spring-web.jar/spring-webmvc.jar spring-remoting.jar需 spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-context.jar/spring-web.jar/spring-webmvc.jar spring-support.jar需 spring-core.jar/spring-beans.jar/spring-aop.jar/spring-dao.jar/spring-context.jar/spring-jdbc.jar spring-mock.jar需spring-core.jar/spring-beans.jar/spring-dao.jar/spring-context.jar/spring-jdbc插件介绍 我们简单地创建一个示例工程,里面包含有一个接口类与两个实现该接口的实现类进行演示说明使用的方法。 需要引入spring.jar、commons-logging.jar、log4j.jar 单个引入需要引入spring-core.jar、spring-beans.jar、spring-context.jar 接口类:IHelloWorld.java public interface IHelloWorld { String sayHelloWorld(); } 实现类一:HelloWorld1.java public class HelloWorld1 implements IHelloWorld { public HelloWorld1() { super(); } public String sayHelloWorld() { return "Hello World HelloWorld1"; } } 实现类二:HelloWorld2.java public class HelloWorld2 implements IHelloWorld { public HelloWorld2() { super(); } public String sayHelloWorld() { return "Hello World HelloWorld2"; } } 根据常用的三层与Spring的最佳实践,将配置文件分成了四个 beanRefFactory.xml负责总装,由SingletonBeanFactoryLocator来装入 通过ClassPathXmlApplicationContext来把其它三个模块的文件引入 beanRefDataAccess.xml负责DAO,与数据库相关的bean都定义在这里 beanRefService.xml负责Service层的bean定义 beanRefMVC.xml负责Spring MVC方面相关的bean定义等等 以下配置文件的bean定义为演示所用,各自的内容如下: beanRefFactory.xml的内容如下: <xml version="1.0" encoding="UTF-8"> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="beanFactory" class="org.springframework.context.support.ClassPathXmlApplicationContext"> <constructor-arg> <list> <value>beanRefDataAccess.xml</value> <value>beanRefService.xml</value> <value>beanRefMVC.xml</value> </list> </constructor-arg> </bean> </beans> beanRefDataAccess.xml的内容如下: <xml version="1.0" encoding="UTF-8"> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloWorldDAO1" class="HelloWorld1"/> <bean id="helloWorldDAO2" class="HelloWorld2"/> </beans> beanRefService.xml的内容如下: <xml version="1.0" encoding="UTF-8"> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloWorld1" class="HelloWorld1"/> <bean id="helloWorld2" class="HelloWorld2"/> <bean id="springDemoConstructor" class="SpringDemoConstructor"> <constructor-arg> <value>Spring IDE Constructor</value> </constructor-arg> <property name="helloWorld"> <ref bean="helloWorld1"></ref> </property> </bean> <bean id="springDemoSetter" class="SpringDemoSetter"> <property name="hello" value="Spring IDE Setter"/> <property name="helloWorld"> <ref bean="helloWorld2"></ref> </property> </bean> </beans> beanRefMVC.xml的内容如下: <xml version="1.0" encoding="UTF-8"> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloWorldMVC1" class="HelloWorld1"/> <bean id="helloWorldMVC2" class="HelloWorld2"/> </beans> 右键项目工程:可以看到“Add Spring Project Nature”菜单,单击它 细心的你一定可以看到项目工程SpringIDEDemo前面的图标变成了一个S的标志,而不是原来的J,当然项目里与Spring相关的文件都会在图标上显示一个S标志。J 右键弹出的菜单里就会有个“Remove Spring Project Nature”的菜单了。 你选择这个菜单进行移除后就不能进行以下的相关操作了。 Window è Show View è Other… è 可以看到Spring IDE,打开它,如下所示,所中它并确定。 可以看到如下的视图,右键工程的名称,在弹出的Properties菜单上点击它 弹出属性框,让我们来添加配置文件 确定后,可以看到刚才选择的四个配置文件已经在里面了,再次确定。 在Spring Beans视图里展开工程后,便可以看到增加进来的四个配置文件了。 也可以将配置文件放到配置集合里,如下所示: 这样确定以后,可以看到四个文件都属于Service的节点下面,如下所示。 再次确定后,在Spring Beans视图里看到Service节点,展开它,可以看到所有配置文件里的bean都在这里列出来了。 展开显示两个定义的bean结点,右键其中的一个结点,弹出四个菜点,最后一个就是上面的配置菜单,不再讲解了,我们选中“Open Config File”菜单 于是就会自动打开配置文件,并定位到bean的定义位置上面去了,如下所示,方便进行查看与改动。 在右键弹出的菜单点选中“Open Bean Class”, 就会自动定位到对应的类文件里去了,如下所示。 在右键弹出的菜单点选中“Show Graph”, 就会把当前这个bean以图形的方式显示出来,如下所示。 但是这个演示的文件仅是一个独立的bean,没有任何关联等,下面会演示关联等。 在Spring Beans视图里展开工程后,选中src/beanRefSerice.xml配置文件,在右键弹出的菜单点选中“Show Graph” 就会把当前整个配置文件的内容以bean图形的方式显示出来,如下所示。 以下演示bean的引用及构造注入与setter注入何关联等,更多的操作类似了。 定义一个接口类ISpringDemo.java,有两个方法 public interface ISpringDemo { IHelloWorld getHelloWorld(); String getHello(); } 实现类一SpringDemoConstructor.java,含有构造注入及setter注入 public class SpringDemoConstructor implements ISpringDemo { private String hello; private IHelloWorld helloWorld; public SpringDemoConstructor(String hello) { this.hello = hello; } public String getHello() { return hello; } public IHelloWorld getHelloWorld() { return helloWorld; } public void setHelloWorld(IHelloWorld helloWorld) { this.helloWorld = helloWorld; } } 实现类二SpringDemoSetter.java,都是setter注入 public class SpringDemoSetter implements ISpringDemo { private String hello; private IHelloWorld helloWorld; public String getHello() { return hello; } public void setHello(String hello) { this.hello = hello; } public IHelloWorld getHelloWorld() { return helloWorld; } public void setHelloWorld(IHelloWorld helloWorld) { this.helloWorld = helloWorld; } } 配置文件beanRefService.xml增加bean定义,成为如下,红字为新增的 <xml version="1.0" encoding="UTF-8"> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloWorld1" class="HelloWorld1"/> <bean id="helloWorld2" class="HelloWorld2"/> <bean id="springDemoConstructor" class="SpringDemoConstructor"> <constructor-arg> <value>Spring IDE Constructor</value> </constructor-arg> <property name="helloWorld"> <ref bean="helloWorld1"></ref> </property> </bean> <bean id="springDemoSetter" class="SpringDemoSetter"> <property name="hello" value="Spring IDE Setter"/> <property name="helloWorld"> <ref bean="helloWorld2"></ref> </property> </bean> </beans> 注意: 如果bean是定义在同一个文件里的可以用 <ref local="helloWorld2"></ref> 如果不是在同一个配置文件里的,要用 <ref bean="helloWorld2"></ref> 要不然会报到bean找不到! 这样配置完成后,我们切换到“Spring Beans”视图,在beanRefService.xml节点上右键打开“Show Graph”菜单,可以看到如下所示: 这时bean里面简单的引用关系就表现出来了。 在bean图上右键,会打开三个操作菜单: Open Java Type即定位到bean的类文件上面; Open Config File即定位到bean的xml配置文件上面; Show In Beans View即定位到“Spring Beans”的视图里的具体某个节点上,如下所示。 此时我们可以在配置集合的Service节点上面右键,选择“Show Graph” 这样就会显示出所有的配置文件集合里的所有bean文件及其关联引用情况,如下图。 带圈的P图标表示是属性,即setter方法注入,带圈的C图标表示构造注入。箭头表示引用关系了。J 中间一排演示用的四个bean没有关联引入,就光杆司令地在那里排队了啦J 最下面的带圈的C后面又跟着一大排参数,表示集合类型的了。如list Spring IDE提供错误检查功能,比如我在配置文件中输入一个不存在的类的名称,保存后,就会在边上出现红色提示,鼠标移上去就会出现提示信息,如下图所示。 当然也会有Problems视图里显示相应的错误信息,如下图: 以下演示bean的引用及构造注入与setter注入何关联等,更多的操作类似了。 定义一个接口类ISpringDemo.java,有两个方法 public interface ISpringDemo { IHelloWorld getHelloWorld(); String getHello(); } 实现类一SpringDemoConstructor.java,含有构造注入及setter注入 public class SpringDemoConstructor implements ISpringDemo { private String hello; private IHelloWorld helloWorld; public SpringDemoConstructor(String hello) { this.hello = hello; } public String getHello() { return hello; } public IHelloWorld getHelloWorld() { return helloWorld; } public void setHelloWorld(IHelloWorld helloWorld) { this.helloWorld = helloWorld; } } 实现类二SpringDemoSetter.java,都是setter注入 public class SpringDemoSetter implements ISpringDemo { private String hello; private IHelloWorld helloWorld; public String getHello() { return hello; } public void setHello(String hello) { this.hello = hello; } public IHelloWorld getHelloWorld() { return helloWorld; } public void setHelloWorld(IHelloWorld helloWorld) { this.helloWorld = helloWorld; } } 配置文件beanRefService.xml增加bean定义,成为如下,红字为新增的 <xml version="1.0" encoding="UTF-8"> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="helloWorld1" class="HelloWorld1"/> <bean id="helloWorld2" class="HelloWorld2"/> <bean id="springDemoConstructor" class="SpringDemoConstructor"> <constructor-arg> <value>Spring IDE Constructor</value> </constructor-arg> <property name="helloWorld"> <ref bean="helloWorld1"></ref> </property> </bean> <bean id="springDemoSetter" class="SpringDemoSetter"> <property name="hello" value="Spring IDE Setter"/> <property name="helloWorld"> <ref bean="helloWorld2"></ref> </property> </bean> </beans> 注意: 如果bean是定义在同一个文件里的可以用 <ref local="helloWorld2"></ref> 如果不是在同一个配置文件里的,要用 <ref bean="helloWorld2"></ref> 要不然会报到bean找不到! 这样配置完成后,我们切换到“Spring Beans”视图,在beanRefService.xml节点上右键打开“Show Graph”菜单,可以看到如下所示: 这时bean里面简单的引用关系就表现出来了。 在bean图上右键,会打开三个操作菜单: Open Java Type即定位到bean的类文件上面; Open Config File即定位到bean的xml配置文件上面; Show In Beans View即定位到“Spring Beans”的视图里的具体某个节点上,如下所示。 此时我们可以在配置集合的Service节点上面右键,选择“Show Graph” 这样就会显示出所有的配置文件集合里的所有bean文件及其关联引用情况,如下图。 带圈的P图标表示是属性,即setter方法注入,带圈的C图标表示构造注入。箭头表示引用关系了。J 中间一排演示用的四个bean没有关联引入,就光杆司令地在那里排队了啦J 最下面的带圈的C后面又跟着一大排参数,表示集合类型的了。如list Spring IDE提供错误检查功能,比如我在配置文件中输入一个不存在的类的名称,保存后,就会在边上出现红色提示,鼠标移上去就会出现提示信息,如下图所示。 当然也会有Problems视图里显示相应的错误信息,如下图: XMLBuddy 由于打开XML文件时会根据XML文件里定义的DTD去网上查找相应的DTD文件,这样导至打开的时候会相当慢,特别是如果你的机器上不了外网的话,就更慢了。 解决的办法有两个: 一、在本机开启Web服务(如Tomcat等等),并设置端口为80,然后根据DTD 的目录结构建立相应的结构,并把DTD文件放进去。然后在hosts文件里把本机的地址映射到相应的DTD指定的网站去,如: 127.0.0.1// www.springframework.org 这样打开XML文件时就会在本机寻找DTD文件进行验证,速度就快很多了J 二、打开XMLBuddy插件的安装目录,并找到其中的cache目录,比如:%ECLIPSE_HOME%/PlugInsNew/xmlbuddy/eclipse/plugins/com.objfac.xmleditor_2.0.72/.cache 打开meta.xml文件,一看就知道怎么处理了吧,如法炮制,选把DTD文件拷贝到这个cache目录里,再增加内容到meta.xml里来,比如: <file> <pub>-//SPRING//DTD BEAN//EN</pub> <abs>http://www.springframework.org/dtd/spring-beans.dtd</abs> <rel>spring-beans.dtd</rel> </file> 要增加其它的DTD文件方法类似,不断地增加说明与DTD文件即可。 于是在编辑XML文件时就会有相关的提示及错误提示信息,可以减少一些书写XML文件时发生的低级错误了。 测试与运行 先建立一个Log4J的配置文件log4j.properties,内容如下 # Set root logger level to ERROR and its only appender to R. log4j.rootLogger = INFO,R # R is set to be a DailyRollingFileAppender. log4j.appender.R = org.apache.log4j.DailyRollingFileAppender log4j.appender.R.File = Application.log log4j.appender.R.DatePattern = yyyy-MM-dd'.log' log4j.appender.R.layout = org.apache.log4j.PatternLayout log4j.appender.R.layout.ConversionPattern = %-d{yyyy-MM-dd HH:mm:ss} [%c]-[%p] %m%n 再创建一个ServiceFactory.java静态类,用来做单元测试方便一些 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 final class ServiceFactory { private static BeanFactoryLocator bfLocator = null; private static BeanFactoryReference bfReference = null; private static BeanFactory factory = null; static { bfLocator = SingletonBeanFactoryLocator.getInstance(); bfReference = bfLocator.useBeanFactory("beanFactory"); factory = bfReference.getFactory(); } private ServiceFactory() { super(); } public static Object getBeanByName(final String beanName) { return factory.getBean(beanName); } }做成静态的这样我们可以ServiceFactory .getBeanByName(“beanname”)就可以得到相应的bean了。 测试类SpringIDETest.java代码如下: import junit.framework.TestCase; public class SpringIDETest extends TestCase { private IHelloWorld helloWorld = null; private ISpringDemo springDemo = null; private final static String hello1 = "Hello World HelloWorld1"; private final static String hello2 = "Hello World HelloWorld2"; private final static String helloset = "Spring IDE Setter"; private final static String hellocon = "Spring IDE Constructor"; public void testSpringBeans() { helloWorld = (IHelloWorld)ServiceFactory.getBeanByName("helloWorld1"); assertEquals(hello1,helloWorld.sayHelloWorld()); helloWorld = (IHelloWorld)ServiceFactory.getBeanByName("helloWorld2"); assertEquals(hello2,helloWorld.sayHelloWorld()); } public void testIoCConstructor() { //Constructor springDemo = (ISpringDemo)ServiceFactory.getBeanByName("springDemoConstructor"); assertEquals(hellocon,springDemo.getHello()); assertEquals(hello1,springDemo.getHelloWorld().sayHelloWorld()); } public void testIoCSetter() { //Setter springDemo = (ISpringDemo)ServiceFactory.getBeanByName("springDemoSetter"); assertEquals(helloset,springDemo.getHello()); assertEquals(hello2,springDemo.getHelloWorld().sayHelloWorld()); } } Run As JUnit Test之,绿色打勾全部通过就收工走人了。。。J 当然也可以打开Application.log文件查看输出一些什么信息。 使用总结 此插件的功能不错:)对于Spring这样优雅的框架来说,再加上这个助手,真的是很美很美了,美美地喝上一杯咖啡吧 |