樂在其中

          以JEE為主攻,以Flex為點綴,以Eclipse RCP為樂趣
          請訪問http://www.inframesh.org

          首頁 新隨筆 聯(lián)系 管理
            43 Posts :: 0 Stories :: 8 Comments :: 0 Trackbacks

           本文介紹如何利用Eclipse插件Spring IDE在Eclipse中的使用。

            Eclipse是目前非常流行的開發(fā)平臺,開放擴展的架構(gòu)讓很多程序員找到了自己個性化的工作環(huán)境。

            問題提出:

            在采用Spring框架進行系統(tǒng)開發(fā)時,Bean的配置文件XML的書寫、XML文件的內(nèi)容校驗及Bean之間的依賴關(guān)系查看等工作,如果能夠采用合適的工具來完成,會成倍提高開發(fā)效率。

            解決方法

            Spring IDE是Spring官方網(wǎng)站推薦的Eclipse插件,可提供在開發(fā)Spring時對Bean定義文件進行驗證并以可視化的方式查看各個Bean之間的依賴關(guān)系等。

            同時,建議結(jié)合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目錄下去,一大堆,累死你:(

          1. 前提是你已經(jīng)下載解壓并設(shè)置好Eclipse工具,比如解壓在E:\OpenSource\Eclipse\目錄下,以下這個目錄以%ECLIPSE_HOME%來進行表示;
          2. 此時默認(rèn)的插件是在%ECLIPSE_HOME%\plugins目錄中的;
          3. 在%ECLIPSE_HOME%下建立一個PlugInsNew的目錄;
              比如:E:\OpenSource\Eclipse\PlugInsNew
          4. 如果你下載了一個新的插件,比如叫做:XYZ

            那么就在%ECLIPSE_HOME%\PlugInsNew\目錄下建立XYZ目錄,目錄里面是eclipse目錄,eclipse目錄包含有features與plugins兩個子目錄;結(jié)構(gòu)如下圖所示:

            圖1
          5. 把下載的新插件的文件放在以下相應(yīng)目錄中;
              %ECLIPSE_HOME%\PlugInsNew\XYZ\eclipse\features

              %ECLIPSE_HOME%\PlugInsNew\ XYZ\eclipse\plugins

          6. 建立相關(guān)的.link的文件;

              然后在%ECLIPSE_HOME%\links目錄里建立一個XYZ.link的文件

              內(nèi)容如是:

              path=E:/OpenSource/Eclipse/PlugInsNew/XYZ

              就一行這樣的路徑指示而已。

              這樣,如果你下載了多個插件就可以如法炮制建立多個Link文件,想加載哪個插件就把哪個插件的Link文件放到%ECLIPSE_HOME%\links的目錄中即可,使用與管理都很方便,建議千萬不要放在默認(rèn)的安裝目錄中,這樣對于升級Eclipse主程序也方便一些;當(dāng)然如果你喜歡用Find and Install…進行安裝的話也可以的;

              如果上面你的%ECLIPSE_HOME%與此不同,請修改XYZ.link文件里的路徑。

          7. 刪除插件,先關(guān)閉Eclipse;
              刪除%ECLIPSE_HOME%\links\XYZ.link文件即可

              刪除%ECLIPSE_HOME%\PlugInsNew\XYZ整個目錄及文件

          8. 重新啟動Eclipse,這樣就可以了。如果插件沒有生效或者沒有刪除,請加上-clean進行啟動Eclipse,即Eclipse.exe –clean

          9. 插件安裝驗證及記錄詳見:Eclipse的workspace下面的.metadata\.log文件,比如:%ECLIPSE_HOME%\workspace\.metadata\.log文件,有問題的話,打開這個文件看看并進行解決。

           確認(rèn)安裝

            此插件安裝方法采用上一節(jié)的《Eclipse使用技巧之插件管理》

            重新啟動Eclipse后,在Help è About Eclipse SDK è Plug-in Details你可以看到由“Spring IDE Developer”提供的“Spring IDE”版本為“1.3.2”插件及相關(guān)的Graph、UI及UI Search插件,如下圖所示:

          圖2
           
            相關(guān)要求

            注意:為了讓Spring IDE插件能夠顯示可視化的Bean結(jié)構(gòu)圖形及Bean之間的依賴關(guān)系,需要Eclipse GEF(Graphical Editing Framework)的支持,自己下載并解壓安裝,安裝技巧同上《Eclipse使用技巧之插件管理》。

            Spring 1.2系列當(dāng)前最新的穩(wěn)定版本為1.2.8,下載時可以選擇包含Spring所依賴的一些開源包的文件spring-framework-1.2.8-with-dependencies.zip,如果你已經(jīng)清楚并有了Spring所依賴的相關(guān)開源包,就單獨下載spring-framework-1.2.8.zip即可。建議下載前者。

            解壓后目錄結(jié)構(gòu)及包的說明如下:

          圖3

            dist目錄下是Spring的發(fā)布包,關(guān)于發(fā)布包下面會詳細進行說明;

            docs目錄下是相關(guān)的文檔,包括有Spring api的javadoc、reference參考指南、Spring的taglib標(biāo)簽使用文件及Spring MVC的MVC-step-by-step講解與示例;

            lib目錄下是Spring所依賴的第三方開源包;

            mock目錄下是Spring輔助應(yīng)用測試的Mock源程序;

            samples目錄下是Spring的示例源程序及簡單的webapp示例框架的示例配置,值得好好學(xué)習(xí)的有jpetstore及petclinic,當(dāng)然其它的countries、imagedb、tiles-example也可以好好參考一下;

            src目錄下是Spring的源程序;

            test目錄下Spring的單元測試源程序;

            tiger目錄下是Java 1.5 Tiger方面的相關(guān)及測試源程序。

            Spring包結(jié)構(gòu)說明

            接下來詳細說說dist目錄下jar包的相關(guān)內(nèi)容

            spring.jar是包含有完整發(fā)布的單個jar包,spring.jar中除了spring-mock.jar里所包含的內(nèi)容外其它所有jar包的內(nèi)容,因為只有在開發(fā)環(huán)境下才會用到spring-mock.jar來進行輔助測試,正式應(yīng)用系統(tǒng)中是用不得這些類的。

            除了spring.jar文件,Spring還包括有其它13個獨立的jar包,各自包含著對應(yīng)的Spring組件,用戶可以根據(jù)自己的需要來選擇組合自己的jar包,而不必引入整個spring.jar的所有類文件。

            spring-core.jar

            這個jar文件包含Spring框架基本的核心工具類,Spring其它組件要都要使用到這個包里的類,是其它組件的基本核心,當(dāng)然你也可以在自己的應(yīng)用系統(tǒng)中使用這些工具類。

            spring-beans.jar

            這個jar文件是所有應(yīng)用都要用到的,它包含訪問配置文件、創(chuàng)建和管理bean以及進行Inversion of Control / Dependency Injection(IoC/DI)操作相關(guān)的所有類。如果應(yīng)用只需基本的IoC/DI支持,引入spring-core.jar及spring-beans.jar文件就可以了。

            spring-aop.jar

            這個jar文件包含在應(yīng)用中使用Spring的AOP特性時所需的類。使用基于AOP的Spring特性,如聲明型事務(wù)管理(Declarative Transaction Management),也要在應(yīng)用里包含這個jar包。

            spring-context.jar

            這個jar文件為Spring核心提供了大量擴展。可以找到使用Spring ApplicationContext特性時所需的全部類,JDNI所需的全部類,UI方面的用來與模板(Templating)引擎如Velocity、FreeMarker、JasperReports集成的類,以及校驗Validation方面的相關(guān)類。

            spring-dao.jar

            這個jar文件包含Spring DAO、Spring Transaction進行數(shù)據(jù)訪問的所有類。為了使用聲明型事務(wù)支持,還需在自己的應(yīng)用里包含spring-aop.jar。

            spring-hibernate.jar

            這個jar文件包含Spring對Hibernate 2及Hibernate 3進行封裝的所有類。

            spring-jdbc.jar

            這個jar文件包含對Spring對JDBC數(shù)據(jù)訪問進行封裝的所有類。

            spring-orm.jar

            這個jar文件包含Spring對DAO特性集進行了擴展,使其支持 iBATIS、JDO、OJB、TopLink,因為Hibernate已經(jīng)獨立成包了,現(xiàn)在不包含在這個包里了。這個jar文件里大部分的類都要依賴spring-dao.jar里的類,用這個包時你需要同時包含spring-dao.jar包。

            spring-remoting.jar

            這個jar文件包含支持EJB、JMS、遠程調(diào)用Remoting(RMI、Hessian、Burlap、Http Invoker、JAX-RPC)方面的類。

            spring-support.jar

            這個jar文件包含支持緩存Cache(ehcache)、JCA、JMX、郵件服務(wù)(Java Mail、COS Mail)、任務(wù)計劃Scheduling(Timer、Quartz)方面的類。

            spring-web.jar

            這個jar文件包含Web應(yīng)用開發(fā)時,用到Spring框架時所需的核心類,包括自動載入WebApplicationContext特性的類、Struts與JSF集成類、文件上傳的支持類、Filter類和大量工具輔助類。

            spring-webmvc.jar

            這個jar文件包含Spring MVC框架相關(guān)的所有類。包含國際化、標(biāo)簽、Theme、視圖展現(xiàn)的FreeMarker、JasperReports、Tiles、Velocity、XSLT相關(guān)類。當(dāng)然,如果你的應(yīng)用使用了獨立的MVC框架,則無需這個JAR文件里的任何類。

            spring-mock.jar

            這個jar文件包含Spring一整套mock類來輔助應(yīng)用的測試。Spring測試套件使用了其中大量mock類,這樣測試就更加簡單。模擬HttpServletRequest和HttpServletResponse類在Web應(yīng)用單元測試是很方便的。

            如何選擇這些發(fā)布包,決定選用哪些發(fā)布包其實相當(dāng)簡單。如果你正在構(gòu)建Web應(yīng)用并將全程使用Spring,那么最好就使用單個全部的spring.jar文件;如果你的應(yīng)用僅僅用到簡單的Inversion of Control / Dependency Injection(IoC/DI)容器,那么只需spring-core.jar與spring-beans.jar即可;如果你對發(fā)布的大小要求很高,那么就得精挑細選了,只取包含自己所需特性的jar文件了。采用獨立的發(fā)布包你可以避免包含自己的應(yīng)用不需要的全部類。當(dāng)然你可以采用其它的一些工具來設(shè)法令整個應(yīng)用包變小,節(jié)省空間的重點在于準(zhǔn)確地找出自己所需的Spring依賴類,然后合并所需的類與包就可以了。Eclispe有個插件叫ClassPath Helper可以幫你找找所依賴的類。

            Spring包依賴說明

          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
           插件介紹

            我們簡單地創(chuàng)建一個示例工程,里面包含有一個接口類與兩個實現(xiàn)該接口的實現(xiàn)類進行演示說明使用的方法。

            需要引入spring.jar、commons-logging.jar、log4j.jar

            單個引入需要引入spring-core.jar、spring-beans.jar、spring-context.jar

            接口類:IHelloWorld.java
          public interface     IHelloWorld
          {
                String sayHelloWorld();
          }

            實現(xiàn)類一:HelloWorld1.java
          public class HelloWorld1 implements IHelloWorld
          {
          public HelloWorld1()
          {
               super();
          }
          public String sayHelloWorld()
          {
               return "Hello World HelloWorld1";
          }
          }
          

            實現(xiàn)類二:HelloWorld2.java
          public class HelloWorld2 implements IHelloWorld
          {
          public HelloWorld2()
          {
               super();
          }
          public String sayHelloWorld()
          {
               return "Hello World HelloWorld2";
          }
          }
          

            根據(jù)常用的三層與Spring的最佳實踐,將配置文件分成了四個

            beanRefFactory.xml負責(zé)總裝,由SingletonBeanFactoryLocator來裝入

            通過ClassPathXmlApplicationContext來把其它三個模塊的文件引入

            beanRefDataAccess.xml負責(zé)DAO,與數(shù)據(jù)庫相關(guān)的bean都定義在這里

            beanRefService.xml負責(zé)Service層的bean定義

            beanRefMVC.xml負責(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>
          

            右鍵項目工程:可以看到“Add Spring Project Nature”菜單,單擊它

          圖4

            細心的你一定可以看到項目工程SpringIDEDemo前面的圖標(biāo)變成了一個S的標(biāo)志,而不是原來的J,當(dāng)然項目里與Spring相關(guān)的文件都會在圖標(biāo)上顯示一個S標(biāo)志。J

            右鍵彈出的菜單里就會有個“Remove Spring Project Nature”的菜單了。

            你選擇這個菜單進行移除后就不能進行以下的相關(guān)操作了。

          圖5

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

          圖6

            可以看到如下的視圖,右鍵工程的名稱,在彈出的Properties菜單上點擊它

          圖7

            彈出屬性框,讓我們來添加配置文件

          圖8

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

          圖9

            在Spring Beans視圖里展開工程后,便可以看到增加進來的四個配置文件了。

          圖10

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

          圖11

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

          圖12

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

          圖13

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

          圖14

            于是就會自動打開配置文件,并定位到bean的定義位置上面去了,如下所示,方便進行查看與改動。

          圖15

            在右鍵彈出的菜單點選中“Open Bean Class”,

          圖16

            就會自動定位到對應(yīng)的類文件里去了,如下所示。

          圖17

            在右鍵彈出的菜單點選中“Show Graph”,

          圖18

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

          圖19

            但是這個演示的文件僅是一個獨立的bean,沒有任何關(guān)聯(lián)等,下面會演示關(guān)聯(lián)等。

            在Spring Beans視圖里展開工程后,選中src/beanRefSerice.xml配置文件,在右鍵彈出的菜單點選中“Show Graph”

          圖20

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

          圖21

            以下演示bean的引用及構(gòu)造注入與setter注入何關(guān)聯(lián)等,更多的操作類似了。

            定義一個接口類ISpringDemo.java,有兩個方法
            public interface ISpringDemo
          {
          IHelloWorld getHelloWorld();
          String getHello();
          }
          

            實現(xiàn)類一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;
          }
          }
          

            實現(xiàn)類二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節(jié)點上右鍵打開“Show Graph”菜單,可以看到如下所示:

          圖21

            這時bean里面簡單的引用關(guān)系就表現(xiàn)出來了。

          圖22

            在bean圖上右鍵,會打開三個操作菜單:

            Open Java Type即定位到bean的類文件上面;

            Open Config File即定位到bean的xml配置文件上面;

            Show In Beans View即定位到“Spring Beans”的視圖里的具體某個節(jié)點上,如下所示。

          圖23

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

          圖24

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

          圖25

            帶圈的P圖標(biāo)表示是屬性,即setter方法注入,帶圈的C圖標(biāo)表示構(gòu)造注入。箭頭表示引用關(guān)系了。J

            中間一排演示用的四個bean沒有關(guān)聯(lián)引入,就光桿司令地在那里排隊了啦J

            最下面的帶圈的C后面又跟著一大排參數(shù),表示集合類型的了。如list

            Spring IDE提供錯誤檢查功能,比如我在配置文件中輸入一個不存在的類的名稱,保存后,就會在邊上出現(xiàn)紅色提示,鼠標(biāo)移上去就會出現(xiàn)提示信息,如下圖所示。

          圖26

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

          圖27

            以下演示bean的引用及構(gòu)造注入與setter注入何關(guān)聯(lián)等,更多的操作類似了。

            定義一個接口類ISpringDemo.java,有兩個方法
            public interface ISpringDemo
          {
          IHelloWorld getHelloWorld();
          String getHello();
          }
          

            實現(xiàn)類一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;
          }
          }
          

            實現(xiàn)類二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節(jié)點上右鍵打開“Show Graph”菜單,可以看到如下所示:

          圖21

            這時bean里面簡單的引用關(guān)系就表現(xiàn)出來了。

          圖22

            在bean圖上右鍵,會打開三個操作菜單:

            Open Java Type即定位到bean的類文件上面;

            Open Config File即定位到bean的xml配置文件上面;

            Show In Beans View即定位到“Spring Beans”的視圖里的具體某個節(jié)點上,如下所示。

          圖23

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

          圖24

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

          圖25

            帶圈的P圖標(biāo)表示是屬性,即setter方法注入,帶圈的C圖標(biāo)表示構(gòu)造注入。箭頭表示引用關(guān)系了。J

            中間一排演示用的四個bean沒有關(guān)聯(lián)引入,就光桿司令地在那里排隊了啦J

            最下面的帶圈的C后面又跟著一大排參數(shù),表示集合類型的了。如list

            Spring IDE提供錯誤檢查功能,比如我在配置文件中輸入一個不存在的類的名稱,保存后,就會在邊上出現(xiàn)紅色提示,鼠標(biāo)移上去就會出現(xiàn)提示信息,如下圖所示。

          圖26

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

          圖27

           XMLBuddy

            由于打開XML文件時會根據(jù)XML文件里定義的DTD去網(wǎng)上查找相應(yīng)的DTD文件,這樣導(dǎo)至打開的時候會相當(dāng)慢,特別是如果你的機器上不了外網(wǎng)的話,就更慢了。

            解決的辦法有兩個:

            一、在本機開啟Web服務(wù)(如Tomcat等等),并設(shè)置端口為80,然后根據(jù)DTD 的目錄結(jié)構(gòu)建立相應(yīng)的結(jié)構(gòu),并把DTD文件放進去。然后在hosts文件里把本機的地址映射到相應(yīng)的DTD指定的網(wǎng)站去,如:

            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目錄里,再增加內(nèi)容到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文件時就會有相關(guān)的提示及錯誤提示信息,可以減少一些書寫XML文件時發(fā)生的低級錯誤了。

          圖28

            測試與運行

            先建立一個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)建一個ServiceFactory.java靜態(tài)類,用來做單元測試方便一些
          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了。

            測試類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

            當(dāng)然也可以打開Application.log文件查看輸出一些什么信息。

            使用總結(jié)

            此插件的功能不錯:)對于Spring這樣優(yōu)雅的框架來說,再加上這個助手,真的是很美很美了,美美地喝上一杯咖啡吧
          posted on 2009-02-04 23:40 suprasoft Inc,. 閱讀(588) 評論(0)  編輯  收藏 所屬分類: Eclipse
          ©2005-2008 Suprasoft Inc., All right reserved.
          主站蜘蛛池模板: 无极县| 鞍山市| 平度市| 苏尼特右旗| 华安县| 黄冈市| 云阳县| 凤庆县| 内江市| 波密县| 沁阳市| 四子王旗| 彝良县| 邵阳县| 阿坝| 蒙山县| 丰台区| 婺源县| 庆城县| 秦皇岛市| 雅江县| 历史| 丰县| 淮滨县| 崇左市| 托克逊县| 河西区| 宁城县| 华安县| 新昌县| 新余市| 灵璧县| 宿松县| 五原县| 长治市| 新宾| 巴青县| 钦州市| 项城市| 静乐县| 昌吉市|