隨筆-314  評論-209  文章-0  trackbacks-0

          XDoclet是生成配置文件的強有力的工具,在使用Spring框架時,手動編寫Spring配置文件極其繁瑣,而且容易遺漏,利用XDoclet即可輕松生成配置文件。

          XDoclet支持的Spring方法注入包括:ref,list,name和value。遺憾的是,在某個項目中,我需要注入一個包含Bean引用的List:

          				
          						public void setHandlers(List handlers) {
          ? ...
          }

          然后,XDoclet并不支持元素為引用類型的List,倘若使用下列注釋:

          				
          						/**
          ?* @spring.property list="articleHandler,imageHandler"
          ?*/
          public void setHandlers(List handlers) {
          ? ...
          }

          生成的配置文件如下:

          				
          						<property name="handlers">
          ? <list>
          ??? <value>articleHandler</value>
          ??? <value>imageHandler</value>
          ? </list>
          </property>

          毫無疑問,在Spring啟動時,一個ClassCastException將被拋出,因為無法將String類型轉化為我們自定義的Handler引用類型。

          幸運的是,XDoclet良好的可擴展性使我們能夠輕松擴展需要的配置,甚至不需要我們利用XDoclet提供的API編寫代碼。XDoclet提供一種XML結構的模版語言來生成配置文件,對于Spring配置文件,對應的XML配置文件在xdoclet-spring-module-1.2.3.jar/xdoclet/modules/spring/resources/spring_xml.xdt中。

          解開jar包,修改spring_xml.xdt,增加如下XML片斷(紅色部分):

          				
          						? <XDtMethod:forAllMethods superclasses="true">
          ?? <XDtMethod:ifHasMethodTag tagName="spring.property">
          ??? <property name="<XDtMethod:propertyName/>">
          ??? <XDtMethod:ifHasMethodTag tagName="spring.property" paramName="value">
          ????? <value><XDtMethod:methodTagValue tagName="spring.property" paramName="value"/></value>
          ??? </XDtMethod:ifHasMethodTag>
          ??? <XDtMethod:ifHasMethodTag tagName="spring.property" paramName="ref">
          ????? <ref bean="<XDtMethod:methodTagValue tagName="spring.property" paramName="ref"/>"/>
          ??? </XDtMethod:ifHasMethodTag>
          ??? <XDtMethod:ifHasMethodTag tagName="spring.property" paramName="list">
          ????? <list>
          ????? <XDtMethod:forAllMethodTagTokens tagName="spring.property" paramName="list">
          ??????? <value><XDtMethod:currentToken/></value>
          ????? </XDtMethod:forAllMethodTagTokens>
          ????? </list>
          ??? </XDtMethod:ifHasMethodTag>
          				
          						??? <XDtMethod:ifHasMethodTag tagName="spring.property" paramName="list.ref">
          ????? <list>
          ??????? <XDtMethod:forAllMethodTagTokens tagName="spring.property" paramName="list.ref">
          ????????? <ref bean="<XDtMethod:currentToken/>"/>
          ??????? </XDtMethod:forAllMethodTagTokens>
          ????? </list>
          ??? </XDtMethod:ifHasMethodTag>
          				
          						??? </property>
          ?? </XDtMethod:ifHasMethodTag>
          ? </XDtMethod:forAllMethods>

          注意紅色部分的代碼,我們仿照list,增加一個list.ref來實現引用類型的List。
          現在,修改注釋如下:

          				
          						/**
          ?* @spring.property list.ref="articleHandler,imageHandler"
          ?*/
          public void setHandlers(List handlers) {
          ? ...
          }

          備份好原有的xdoclet-spring-module-1.2.3.jar,然后將修改后的目錄打包:

          						jar cvf xdoclet-spring-module-1.2.3.jar .
          				

          替換原來的xdoclet-spring-module-1.2.3.jar,運行XDoclet,順利生成預期配置:
          <property name="handlers">
          ? <list>
          ??? <ref bean="articleHandler"/>
          ??? <ref bean="imageHandler"/>
          ? </list>
          </property>

          類似的,我們還可以增加XDoclet對Map注入的支持。

          posted on 2006-11-05 08:32 xzc 閱讀(602) 評論(0)  編輯  收藏 所屬分類: Xdoclet
          主站蜘蛛池模板: 工布江达县| 宁海县| 辉县市| 本溪| 丽江市| 孟连| 永定县| 宝坻区| 方城县| 富川| 禄丰县| 股票| 佛学| 博罗县| 凉山| 泽州县| 杭锦旗| 南通市| 乌拉特后旗| 蓝山县| 安溪县| 潞城市| 临安市| 岳普湖县| 永登县| 南华县| 成武县| 平陆县| 英吉沙县| 庐江县| 绿春县| 漠河县| 大关县| 溧阳市| 洪江市| 马公市| 凤阳县| 安丘市| 普宁市| 张北县| 辉南县|