本文介紹如何利用Eclipse插件Spring IDE在Eclipse中的使用。
Eclipse是目前非常流行的開(kāi)發(fā)平臺(tái),開(kāi)放擴(kuò)展的架構(gòu)讓很多程序員找到了自己個(gè)性化的工作環(huán)境。
問(wèn)題提出:
在采用Spring框架進(jìn)行系統(tǒng)開(kāi)發(fā)時(shí),Bean的配置文件XML的書(shū)寫(xiě)、XML文件的內(nèi)容校驗(yàn)及Bean之間的依賴(lài)關(guān)系查看等工作,如果能夠采用合適的工具來(lái)完成,會(huì)成倍提高開(kāi)發(fā)效率。
解決方法:
Spring IDE是Spring官方網(wǎng)站推薦的Eclipse插件,可提供在開(kāi)發(fā)Spring時(shí)對(duì)Bean定義文件進(jìn)行驗(yàn)證并以可視化的方式查看各個(gè)Bean之間的依賴(lài)關(guān)系等。
同時(shí),建議結(jié)合Eclipse XMLBuddy插件進(jìn)行XML文件編輯與校驗(yàn),是個(gè)不錯(cuò)的選擇。
安裝說(shuō)明
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目錄下去,一大堆,累死你:(
- 前提是你已經(jīng)下載解壓并設(shè)置好Eclipse工具,比如解壓在E:\OpenSource\Eclipse\目錄下,以下這個(gè)目錄以%ECLIPSE_HOME%來(lái)進(jìn)行表示;
- 此時(shí)默認(rèn)的插件是在%ECLIPSE_HOME%\plugins目錄中的;
- 在%ECLIPSE_HOME%下建立一個(gè)PlugInsNew的目錄;
比如:E:\OpenSource\Eclipse\PlugInsNew
- 如果你下載了一個(gè)新的插件,比如叫做:XYZ
那么就在%ECLIPSE_HOME%\PlugInsNew\目錄下建立XYZ目錄,目錄里面是eclipse目錄,eclipse目錄包含有features與plugins兩個(gè)子目錄;結(jié)構(gòu)如下圖所示:
- 把下載的新插件的文件放在以下相應(yīng)目錄中;
%ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features
%ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins
- 建立相關(guān)的.link的文件;
然后在%ECLIPSE_HOME%\links目錄里建立一個(gè)XYZ.link的文件
內(nèi)容如是:
path=E:/OpenSource/Eclipse/PlugInsNew/XYZ
就一行這樣的路徑指示而已。
這樣,如果你下載了多個(gè)插件就可以如法炮制建立多個(gè)Link文件,想加載哪個(gè)插件就把哪個(gè)插件的Link文件放到%ECLIPSE_HOME%\links的目錄中即可,使用與管理都很方便,建議千萬(wàn)不要放在默認(rèn)的安裝目錄中,這樣對(duì)于升級(jí)Eclipse主程序也方便一些;當(dāng)然如果你喜歡用Find and Install…進(jìn)行安裝的話(huà)也可以的;
如果上面你的%ECLIPSE_HOME%與此不同,請(qǐng)修改XYZ.link文件里的路徑。
- 刪除插件,先關(guān)閉Eclipse;
刪除%ECLIPSE_HOME%\links\XYZ.link文件即可
刪除%ECLIPSE_HOME%\PlugInsNew\XYZ整個(gè)目錄及文件
- 重新啟動(dòng)Eclipse,這樣就可以了。如果插件沒(méi)有生效或者沒(méi)有刪除,請(qǐng)加上-clean進(jìn)行啟動(dòng)Eclipse,即Eclipse.exe –clean
- 插件安裝驗(yàn)證及記錄詳見(jiàn):Eclipse的workspace下面的.metadata\.log文件,比如:%ECLIPSE_HOME%\workspace\.metadata\.log文件,有問(wèn)題的話(huà),打開(kāi)這個(gè)文件看看并進(jìn)行解決。
確認(rèn)安裝
此插件安裝方法采用上一節(jié)的《Eclipse使用技巧之插件管理》
重新啟動(dòng)Eclipse后,在Help è About Eclipse SDK è Plug-in Details你可以看到由“Spring IDE Developer”提供的“Spring IDE”版本為“1.3.2”插件及相關(guān)的Graph、UI及UI Search插件,如下圖所示:
相關(guān)要求
注意:為了讓Spring IDE插件能夠顯示可視化的Bean結(jié)構(gòu)圖形及Bean之間的依賴(lài)關(guān)系,需要Eclipse GEF(Graphical Editing Framework)的支持,自己下載并解壓安裝,安裝技巧同上《Eclipse使用技巧之插件管理》。
Spring 1.2系列當(dāng)前最新的穩(wěn)定版本為1.2.8,下載時(shí)可以選擇包含Spring所依賴(lài)的一些開(kāi)源包的文件spring-framework-1.2.8-with-dependencies.zip,如果你已經(jīng)清楚并有了Spring所依賴(lài)的相關(guān)開(kāi)源包,就單獨(dú)下載spring-framework-1.2.8.zip即可。建議下載前者。
解壓后目錄結(jié)構(gòu)及包的說(shuō)明如下:
dist目錄下是Spring的發(fā)布包,關(guān)于發(fā)布包下面會(huì)詳細(xì)進(jìn)行說(shuō)明;
docs目錄下是相關(guān)的文檔,包括有Spring api的javadoc、reference參考指南、Spring的taglib標(biāo)簽使用文件及Spring MVC的MVC-step-by-step講解與示例;
lib目錄下是Spring所依賴(lài)的第三方開(kāi)源包;
mock目錄下是Spring輔助應(yīng)用測(cè)試的Mock源程序;
samples目錄下是Spring的示例源程序及簡(jiǎn)單的webapp示例框架的示例配置,值得好好學(xué)習(xí)的有jpetstore及petclinic,當(dāng)然其它的countries、imagedb、tiles-example也可以好好參考一下;
src目錄下是Spring的源程序;
test目錄下Spring的單元測(cè)試源程序;
tiger目錄下是Java 1.5 Tiger方面的相關(guān)及測(cè)試源程序。
Spring包結(jié)構(gòu)說(shuō)明
接下來(lái)詳細(xì)說(shuō)說(shuō)dist目錄下jar包的相關(guān)內(nèi)容
spring.jar是包含有完整發(fā)布的單個(gè)jar包,spring.jar中除了spring-mock.jar里所包含的內(nèi)容外其它所有jar包的內(nèi)容,因?yàn)橹挥性陂_(kāi)發(fā)環(huán)境下才會(huì)用到spring-mock.jar來(lái)進(jìn)行輔助測(cè)試,正式應(yīng)用系統(tǒng)中是用不得這些類(lèi)的。
除了spring.jar文件,Spring還包括有其它13個(gè)獨(dú)立的jar包,各自包含著對(duì)應(yīng)的Spring組件,用戶(hù)可以根據(jù)自己的需要來(lái)選擇組合自己的jar包,而不必引入整個(gè)spring.jar的所有類(lèi)文件。
spring-core.jar
這個(gè)jar文件包含Spring框架基本的核心工具類(lèi),Spring其它組件要都要使用到這個(gè)包里的類(lèi),是其它組件的基本核心,當(dāng)然你也可以在自己的應(yīng)用系統(tǒng)中使用這些工具類(lèi)。
spring-beans.jar
這個(gè)jar文件是所有應(yīng)用都要用到的,它包含訪(fǎng)問(wèn)配置文件、創(chuàng)建和管理bean以及進(jìn)行Inversion of Control / Dependency Injection(IoC/DI)操作相關(guān)的所有類(lèi)。如果應(yīng)用只需基本的IoC/DI支持,引入spring-core.jar及spring-beans.jar文件就可以了。
spring-aop.jar
這個(gè)jar文件包含在應(yīng)用中使用Spring的AOP特性時(shí)所需的類(lèi)。使用基于AOP的Spring特性,如聲明型事務(wù)管理(Declarative Transaction Management),也要在應(yīng)用里包含這個(gè)jar包。
spring-context.jar
這個(gè)jar文件為Spring核心提供了大量擴(kuò)展。可以找到使用Spring ApplicationContext特性時(shí)所需的全部類(lèi),JDNI所需的全部類(lèi),UI方面的用來(lái)與模板(Templating)引擎如Velocity、FreeMarker、JasperReports集成的類(lèi),以及校驗(yàn)Validation方面的相關(guān)類(lèi)。
spring-dao.jar
這個(gè)jar文件包含Spring DAO、Spring Transaction進(jìn)行數(shù)據(jù)訪(fǎng)問(wèn)的所有類(lèi)。為了使用聲明型事務(wù)支持,還需在自己的應(yīng)用里包含spring-aop.jar。
spring-hibernate.jar
這個(gè)jar文件包含Spring對(duì)Hibernate 2及Hibernate 3進(jìn)行封裝的所有類(lèi)。
spring-jdbc.jar
這個(gè)jar文件包含對(duì)Spring對(duì)JDBC數(shù)據(jù)訪(fǎng)問(wèn)進(jìn)行封裝的所有類(lèi)。
spring-orm.jar
這個(gè)jar文件包含Spring對(duì)DAO特性集進(jìn)行了擴(kuò)展,使其支持 iBATIS、JDO、OJB、TopLink,因?yàn)镠ibernate已經(jīng)獨(dú)立成包了,現(xiàn)在不包含在這個(gè)包里了。這個(gè)jar文件里大部分的類(lèi)都要依賴(lài)spring-dao.jar里的類(lèi),用這個(gè)包時(shí)你需要同時(shí)包含spring-dao.jar包。
spring-remoting.jar
這個(gè)jar文件包含支持EJB、JMS、遠(yuǎn)程調(diào)用Remoting(RMI、Hessian、Burlap、Http Invoker、JAX-RPC)方面的類(lèi)。
spring-support.jar
這個(gè)jar文件包含支持緩存Cache(ehcache)、JCA、JMX、郵件服務(wù)(Java Mail、COS Mail)、任務(wù)計(jì)劃Scheduling(Timer、Quartz)方面的類(lèi)。
spring-web.jar
這個(gè)jar文件包含Web應(yīng)用開(kāi)發(fā)時(shí),用到Spring框架時(shí)所需的核心類(lèi),包括自動(dòng)載入WebApplicationContext特性的類(lèi)、Struts與JSF集成類(lèi)、文件上傳的支持類(lèi)、Filter類(lèi)和大量工具輔助類(lèi)。
spring-webmvc.jar
這個(gè)jar文件包含Spring MVC框架相關(guān)的所有類(lèi)。包含國(guó)際化、標(biāo)簽、Theme、視圖展現(xiàn)的FreeMarker、JasperReports、Tiles、Velocity、XSLT相關(guān)類(lèi)。當(dāng)然,如果你的應(yīng)用使用了獨(dú)立的MVC框架,則無(wú)需這個(gè)JAR文件里的任何類(lèi)。
spring-mock.jar
這個(gè)jar文件包含Spring一整套mock類(lèi)來(lái)輔助應(yīng)用的測(cè)試。Spring測(cè)試套件使用了其中大量mock類(lèi),這樣測(cè)試就更加簡(jiǎn)單。模擬HttpServletRequest和HttpServletResponse類(lèi)在Web應(yīng)用單元測(cè)試是很方便的。
如何選擇這些發(fā)布包,決定選用哪些發(fā)布包其實(shí)相當(dāng)簡(jiǎn)單。如果你正在構(gòu)建Web應(yīng)用并將全程使用Spring,那么最好就使用單個(gè)全部的spring.jar文件;如果你的應(yīng)用僅僅用到簡(jiǎn)單的Inversion of Control / Dependency Injection(IoC/DI)容器,那么只需spring-core.jar與spring-beans.jar即可;如果你對(duì)發(fā)布的大小要求很高,那么就得精挑細(xì)選了,只取包含自己所需特性的jar文件了。采用獨(dú)立的發(fā)布包你可以避免包含自己的應(yīng)用不需要的全部類(lèi)。當(dāng)然你可以采用其它的一些工具來(lái)設(shè)法令整個(gè)應(yīng)用包變小,節(jié)省空間的重點(diǎn)在于準(zhǔn)確地找出自己所需的Spring依賴(lài)類(lèi),然后合并所需的類(lèi)與包就可以了。Eclispe有個(gè)插件叫ClassPath Helper可以幫你找找所依賴(lài)的類(lèi)。
Spring包依賴(lài)說(shuō)明
spring-core.jar需commons-collections.jar,spring-core.jar是以下其它各個(gè)的基本。 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插件介紹
我們簡(jiǎn)單地創(chuàng)建一個(gè)示例工程,里面包含有一個(gè)接口類(lèi)與兩個(gè)實(shí)現(xiàn)該接口的實(shí)現(xiàn)類(lèi)進(jìn)行演示說(shuō)明使用的方法。
需要引入spring.jar、commons-logging.jar、log4j.jar
單個(gè)引入需要引入spring-core.jar、spring-beans.jar、spring-context.jar
接口類(lèi):IHelloWorld.java
public interface IHelloWorld { String sayHelloWorld(); }
實(shí)現(xiàn)類(lèi)一:HelloWorld1.java
public class HelloWorld1 implements IHelloWorld { public HelloWorld1() { super(); } public String sayHelloWorld() { return "Hello World HelloWorld1"; } }
實(shí)現(xiàn)類(lèi)二:HelloWorld2.java
public class HelloWorld2 implements IHelloWorld { public HelloWorld2() { super(); } public String sayHelloWorld() { return "Hello World HelloWorld2"; } }
根據(jù)常用的三層與Spring的最佳實(shí)踐,將配置文件分成了四個(gè)
beanRefFactory.xml負(fù)責(zé)總裝,由SingletonBeanFactoryLocator來(lái)裝入
通過(guò)ClassPathXmlApplicationContext來(lái)把其它三個(gè)模塊的文件引入
beanRefDataAccess.xml負(fù)責(zé)DAO,與數(shù)據(jù)庫(kù)相關(guān)的bean都定義在這里
beanRefService.xml負(fù)責(zé)Service層的bean定義
beanRefMVC.xml負(fù)責(zé)Spring MVC方面相關(guān)的bean定義等等
以下配置文件的bean定義為演示所用,各自的內(nèi)容如下:
beanRefFactory.xml的內(nèi)容如下:
<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的內(nèi)容如下:
<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的內(nèi)容如下:
<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的內(nèi)容如下:
<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>
右鍵項(xiàng)目工程:可以看到“Add Spring Project Nature”菜單,單擊它

細(xì)心的你一定可以看到項(xiàng)目工程SpringIDEDemo前面的圖標(biāo)變成了一個(gè)S的標(biāo)志,而不是原來(lái)的J,當(dāng)然項(xiàng)目里與Spring相關(guān)的文件都會(huì)在圖標(biāo)上顯示一個(gè)S標(biāo)志。J
右鍵彈出的菜單里就會(huì)有個(gè)“Remove Spring Project Nature”的菜單了。
你選擇這個(gè)菜單進(jìn)行移除后就不能進(jìn)行以下的相關(guān)操作了。

Window è Show View è Other… è 可以看到Spring IDE,打開(kāi)它,如下所示,所中它并確定。

可以看到如下的視圖,右鍵工程的名稱(chēng),在彈出的Properties菜單上點(diǎn)擊它

彈出屬性框,讓我們來(lái)添加配置文件

確定后,可以看到剛才選擇的四個(gè)配置文件已經(jīng)在里面了,再次確定。

在Spring Beans視圖里展開(kāi)工程后,便可以看到增加進(jìn)來(lái)的四個(gè)配置文件了。

也可以將配置文件放到配置集合里,如下所示:

這樣確定以后,可以看到四個(gè)文件都屬于Service的節(jié)點(diǎn)下面,如下所示。

再次確定后,在Spring Beans視圖里看到Service節(jié)點(diǎn),展開(kāi)它,可以看到所有配置文件里的bean都在這里列出來(lái)了。

展開(kāi)顯示兩個(gè)定義的bean結(jié)點(diǎn),右鍵其中的一個(gè)結(jié)點(diǎn),彈出四個(gè)菜點(diǎn),最后一個(gè)就是上面的配置菜單,不再講解了,我們選中“Open Config File”菜單

于是就會(huì)自動(dòng)打開(kāi)配置文件,并定位到bean的定義位置上面去了,如下所示,方便進(jìn)行查看與改動(dòng)。

在右鍵彈出的菜單點(diǎn)選中“Open Bean Class”,

就會(huì)自動(dòng)定位到對(duì)應(yīng)的類(lèi)文件里去了,如下所示。

在右鍵彈出的菜單點(diǎn)選中“Show Graph”,

就會(huì)把當(dāng)前這個(gè)bean以圖形的方式顯示出來(lái),如下所示。

但是這個(gè)演示的文件僅是一個(gè)獨(dú)立的bean,沒(méi)有任何關(guān)聯(lián)等,下面會(huì)演示關(guān)聯(lián)等。
在Spring Beans視圖里展開(kāi)工程后,選中src/beanRefSerice.xml配置文件,在右鍵彈出的菜單點(diǎn)選中“Show Graph”

就會(huì)把當(dāng)前整個(gè)配置文件的內(nèi)容以bean圖形的方式顯示出來(lái),如下所示。

以下演示bean的引用及構(gòu)造注入與setter注入何關(guān)聯(lián)等,更多的操作類(lèi)似了。
定義一個(gè)接口類(lèi)ISpringDemo.java,有兩個(gè)方法
public interface ISpringDemo { IHelloWorld getHelloWorld(); String getHello(); }
實(shí)現(xiàn)類(lèi)一SpringDemoConstructor.java,含有構(gòu)造注入及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; } }
實(shí)現(xiàn)類(lèi)二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是定義在同一個(gè)文件里的可以用
<ref local="helloWorld2"></ref>
如果不是在同一個(gè)配置文件里的,要用
<ref bean="helloWorld2"></ref>
要不然會(huì)報(bào)到bean找不到!
這樣配置完成后,我們切換到“Spring Beans”視圖,在beanRefService.xml節(jié)點(diǎn)上右鍵打開(kāi)“Show Graph”菜單,可以看到如下所示:

這時(shí)bean里面簡(jiǎn)單的引用關(guān)系就表現(xiàn)出來(lái)了。

在bean圖上右鍵,會(huì)打開(kāi)三個(gè)操作菜單:
Open Java Type即定位到bean的類(lèi)文件上面;
Open Config File即定位到bean的xml配置文件上面;
Show In Beans View即定位到“Spring Beans”的視圖里的具體某個(gè)節(jié)點(diǎn)上,如下所示。

此時(shí)我們可以在配置集合的Service節(jié)點(diǎn)上面右鍵,選擇“Show Graph”

這樣就會(huì)顯示出所有的配置文件集合里的所有bean文件及其關(guān)聯(lián)引用情況,如下圖。

帶圈的P圖標(biāo)表示是屬性,即setter方法注入,帶圈的C圖標(biāo)表示構(gòu)造注入。箭頭表示引用關(guān)系了。J
中間一排演示用的四個(gè)bean沒(méi)有關(guān)聯(lián)引入,就光桿司令地在那里排隊(duì)了啦J
最下面的帶圈的C后面又跟著一大排參數(shù),表示集合類(lèi)型的了。如list
Spring IDE提供錯(cuò)誤檢查功能,比如我在配置文件中輸入一個(gè)不存在的類(lèi)的名稱(chēng),保存后,就會(huì)在邊上出現(xiàn)紅色提示,鼠標(biāo)移上去就會(huì)出現(xiàn)提示信息,如下圖所示。

當(dāng)然也會(huì)有Problems視圖里顯示相應(yīng)的錯(cuò)誤信息,如下圖:

以下演示bean的引用及構(gòu)造注入與setter注入何關(guān)聯(lián)等,更多的操作類(lèi)似了。
定義一個(gè)接口類(lèi)ISpringDemo.java,有兩個(gè)方法
public interface ISpringDemo { IHelloWorld getHelloWorld(); String getHello(); }
實(shí)現(xiàn)類(lèi)一SpringDemoConstructor.java,含有構(gòu)造注入及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; } }
實(shí)現(xiàn)類(lèi)二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是定義在同一個(gè)文件里的可以用
<ref local="helloWorld2"></ref>
如果不是在同一個(gè)配置文件里的,要用
<ref bean="helloWorld2"></ref>
要不然會(huì)報(bào)到bean找不到!
這樣配置完成后,我們切換到“Spring Beans”視圖,在beanRefService.xml節(jié)點(diǎn)上右鍵打開(kāi)“Show Graph”菜單,可以看到如下所示:

這時(shí)bean里面簡(jiǎn)單的引用關(guān)系就表現(xiàn)出來(lái)了。

在bean圖上右鍵,會(huì)打開(kāi)三個(gè)操作菜單:
Open Java Type即定位到bean的類(lèi)文件上面;
Open Config File即定位到bean的xml配置文件上面;
Show In Beans View即定位到“Spring Beans”的視圖里的具體某個(gè)節(jié)點(diǎn)上,如下所示。

此時(shí)我們可以在配置集合的Service節(jié)點(diǎn)上面右鍵,選擇“Show Graph”

這樣就會(huì)顯示出所有的配置文件集合里的所有bean文件及其關(guān)聯(lián)引用情況,如下圖。

帶圈的P圖標(biāo)表示是屬性,即setter方法注入,帶圈的C圖標(biāo)表示構(gòu)造注入。箭頭表示引用關(guān)系了。J
中間一排演示用的四個(gè)bean沒(méi)有關(guān)聯(lián)引入,就光桿司令地在那里排隊(duì)了啦J
最下面的帶圈的C后面又跟著一大排參數(shù),表示集合類(lèi)型的了。如list
Spring IDE提供錯(cuò)誤檢查功能,比如我在配置文件中輸入一個(gè)不存在的類(lèi)的名稱(chēng),保存后,就會(huì)在邊上出現(xiàn)紅色提示,鼠標(biāo)移上去就會(huì)出現(xiàn)提示信息,如下圖所示。

當(dāng)然也會(huì)有Problems視圖里顯示相應(yīng)的錯(cuò)誤信息,如下圖:

XMLBuddy
由于打開(kāi)XML文件時(shí)會(huì)根據(jù)XML文件里定義的DTD去網(wǎng)上查找相應(yīng)的DTD文件,這樣導(dǎo)至打開(kāi)的時(shí)候會(huì)相當(dāng)慢,特別是如果你的機(jī)器上不了外網(wǎng)的話(huà),就更慢了。
解決的辦法有兩個(gè):
一、在本機(jī)開(kāi)啟Web服務(wù)(如Tomcat等等),并設(shè)置端口為80,然后根據(jù)DTD 的目錄結(jié)構(gòu)建立相應(yīng)的結(jié)構(gòu),并把DTD文件放進(jìn)去。然后在hosts文件里把本機(jī)的地址映射到相應(yīng)的DTD指定的網(wǎng)站去,如:
127.0.0.1// www.springframework.org
這樣打開(kāi)XML文件時(shí)就會(huì)在本機(jī)尋找DTD文件進(jìn)行驗(yàn)證,速度就快很多了J
二、打開(kāi)XMLBuddy插件的安裝目錄,并找到其中的cache目錄,比如:%ECLIPSE_HOME%\PlugInsNew\xmlbuddy\eclipse\plugins\com.objfac.xmleditor_2.0.72\.cache
打開(kāi)meta.xml文件,一看就知道怎么處理了吧,如法炮制,選把DTD文件拷貝到這個(gè)cache目錄里,再增加內(nèi)容到meta.xml里來(lái),比如:
<file> <pub>-//SPRING//DTD BEAN//EN</pub> <abs>http://www.springframework.org/dtd/spring-beans.dtd</abs> <rel>spring-beans.dtd</rel> </file>
要增加其它的DTD文件方法類(lèi)似,不斷地增加說(shuō)明與DTD文件即可。
于是在編輯XML文件時(shí)就會(huì)有相關(guān)的提示及錯(cuò)誤提示信息,可以減少一些書(shū)寫(xiě)XML文件時(shí)發(fā)生的低級(jí)錯(cuò)誤了。

測(cè)試與運(yùn)行
先建立一個(gè)Log4J的配置文件log4j.properties,內(nèi)容如下
# 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
再創(chuàng)建一個(gè)ServiceFactory.java靜態(tài)類(lèi),用來(lái)做單元測(cè)試方便一些
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); } }做成靜態(tài)的這樣我們可以ServiceFactory .getBeanByName(“beanname”)就可以得到相應(yīng)的bean了。
測(cè)試類(lèi)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之,綠色打勾全部通過(guò)就收工走人了。。。J
當(dāng)然也可以打開(kāi)Application.log文件查看輸出一些什么信息。
使用總結(jié)
此插件的功能不錯(cuò):)對(duì)于Spring這樣優(yōu)雅的框架來(lái)說(shuō),再加上這個(gè)助手,真的是很美很美了,美美地喝上一杯咖啡吧