如何讓xdoclet 的spring 標籤支持java.util.Map類型屬性的注入java
(如需轉載,請註明引用)spring
用過Xdoclet 工具的Spring 標籤的人應該都知道: XDoclet支持的Spring方法注入包括:ref,list,name和value, 它是不支持java.util.Map類型注入的。 而Spring 是支持Map的注入的方法以下:apache
<bean id="ITest" class="com.tt.xx.oo.common.test.impl.Testor" > <property name="testMap"> <map> <entry key="test1" value="1"/> <entry key="test2" value="xm03"/> </map> </property> </bean>
爲了實現以上這個配置效果, 現只須要按以下步驟進行配置便可。編程
(1)如今只須要在.java源文件中的@spring.property 標籤添加一個map屬性app
/** * @spring.bean * name="Test" * * @spring.property * name="test-list-ref" * map="{student:1,teacher:2}" */ public class Test { private Map<String, String> myMap; /** * @param myMap the myMap to set */ public void setMyMap(Map<String, String> myMap) { this.myMap = myMap; } }
注意: map 屬性的值的寫法,多個鍵值之間用分號分隔,鍵與值之間用冒號分隔工具
(2) 另外,Xdoclet 指定的生成模板文件spring_xml.xdt 也得作以下修改:this
只須要在property 元素以內添加spa
<XDtTagDef:tagDef namespace="TemplateEngines" handler="xdoclet.modules.apache.velocity.VelocityEngineTagHandler"/> <XDtClass:ifHasClassTag tagName="spring.property" paramName="map"> <XDtTemplateEngines:generator> #set($input=${currentClassTag.getAttributeValue('map')}) #set($input1=${input.replaceAll("\{", "").replaceAll("}", "")}) #set($groups=${input1.split(',')}) #if(${groups.isEmpty()}) #else <map> #foreach( $group in ${input1.split(',')}) #set($kv=${group.split(':')}) #set($k=${kv[0].trim()}) #set($v=${kv[1].trim()}) #if(${v.startsWith("&")}) <entry key="$k" value-ref="${v.substring(1)}"/> #else <entry key="$k" value="$v"/> #end #end </map> #end</XDtTemplateEngines:generator> </XDtClass:ifHasClassTag>
說明: 這裏經過xdoclet 對velocity 模板語言的支持,而且在語言腳本運行時能夠取得當前標籤的全部屬性值的特色,對輸出的spring 配置中的map 標籤進行編程code
(3) 爲了要支持Velocity腳本語言,我這裏引用 最新版本的veloctity1.7,則對應的相關引用jar 也得對應,我進行xdoclet 生成過程引用到的jar 如圖xml
根據以上的配置以後,你應該就能夠獲得支持map注入的spring 配置文件了。
如下是對應的spring_xml.xdt 文件:
<?xml version="1.0" encoding="<XDtConfig:configParameterValue paramName='Xmlencoding'/>"?> <!DOCTYPE beans PUBLIC "<XDtXml:publicId/>" "<XDtXml:systemId/>"> <beans default-autowire="<XDtConfig:configParameterValue paramName="defaultAutowire"/>" default-lazy-init="<XDtConfig:configParameterValue paramName="defaultLazyInit"/>" default-dependency-check="<XDtConfig:configParameterValue paramName="defaultDependencyCheck"/>" > <XDtClass:forAllClasses> <XDtClass:forAllClassTags tagName="spring:bean" superclasses="false"> <bean <XDtClass:ifHasClassTag tagName="spring.bean" paramName="id"> id="<XDtClass:classTagValue tagName="spring.bean" paramName="id"/>" </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.bean" paramName="name"> name="<XDtClass:classTagValue tagName="spring.bean" paramName="name"/>" </XDtClass:ifHasClassTag> class="<XDtClass:fullClassName/>" <XDtClass:ifHasClassTag tagName="spring.bean" paramName="abstract"> abstract="<XDtClass:classTagValue tagName="spring.bean" paramName="abstract"/>" </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.bean" paramName="parent"> parent="<XDtClass:classTagValue tagName="spring.bean" paramName="parent"/>" </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.bean" paramName="autowire"> autowire="<XDtClass:classTagValue tagName="spring:bean" paramName="autowire" values="no,byName,byType,constructor,auto-detect"/>" </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.bean" paramName="init-method"> init-method="<XDtClass:classTagValue tagName="spring.bean" paramName="init-method"/>" </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.bean" paramName="destroy-method"> destroy-method="<XDtClass:classTagValue tagName="spring:bean" paramName="destroy-method"/>" </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.bean" paramName="dependency-check"> dependency-check="<XDtClass:classTagValue tagName="spring:bean" paramName="dependency-check" values="all,objects,simple"/>" </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.bean" paramName="singleton"> singleton="<XDtClass:classTagValue tagName="spring:bean" paramName="singleton" values="true,false" default="true"/>" </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.bean" paramName="lazy-init"> lazy-init="<XDtClass:classTagValue tagName="spring:bean" paramName="lazy-init" values="true,false,default" default="default"/>" </XDtClass:ifHasClassTag> > <XDtClass:ifHasClassTag tagName="spring.bean" paramName="description"> <description><XDtClass:classTagValue tagName="spring.bean" paramName="description"/></description> </XDtClass:ifHasClassTag> <XDtConstructor:forAllConstructors> <XDtConstructor:forAllConstructorTags tagName="spring.constructor-arg"> <constructor-arg> <XDtConstructor:ifHasConstructorTag tagName="spring.constructor-arg" paramName="value"> <value><XDtConstructor:constructorTagValue tagName="spring.constructor-arg" paramName="value"/></value> </XDtConstructor:ifHasConstructorTag> <XDtConstructor:ifHasConstructorTag tagName="spring.constructor-arg" paramName="ref"> <ref bean="<XDtConstructor:constructorTagValue tagName="spring.constructor-arg" paramName="ref"/>"/> </XDtConstructor:ifHasConstructorTag> <XDtConstructor:ifHasConstructorTag tagName="spring.constructor-arg" paramName="list-value"> <list> <XDtConstructor:forAllConstructorTagTokens tagName="spring.constructor-arg" paramName="list-value"> <value><XDtConstructor:currentToken/></value> </XDtConstructor:forAllConstructorTagTokens> </list> </XDtConstructor:ifHasConstructorTag> <XDtConstructor:ifHasConstructorTag tagName="spring.constructor-arg" paramName="list-ref"> <list> <XDtConstructor:forAllConstructorTagTokens tagName="spring.constructor-arg" paramName="list-ref"> <ref bean="<XDtClass:currentToken/>"/> </XDtConstructor:forAllConstructorTagTokens> </list> </XDtConstructor:ifHasConstructorTag> </constructor-arg> </XDtConstructor:forAllConstructorTags> </XDtConstructor:forAllConstructors> <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-value"> <list> <XDtMethod:forAllMethodTagTokens tagName="spring.property" paramName="list-value"> <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="<XDtClass:currentToken/>"/> </XDtMethod:forAllMethodTagTokens> </list> </XDtMethod:ifHasMethodTag> </property> </XDtMethod:ifHasMethodTag> </XDtMethod:forAllMethods> <XDtClass:forAllClassTags tagName="spring.property"> <property name="<XDtClass:classTagValue tagName="spring.property" paramName="name"/>"> <XDtClass:ifHasClassTag tagName="spring.property" paramName="value"> <value><XDtClass:classTagValue tagName="spring.property" paramName="value"/></value> </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.property" paramName="ref"> <ref bean="<XDtClass:classTagValue tagName="spring.property" paramName="ref"/>"/> </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.property" paramName="list-value"> <list> <XDtClass:forAllClassTagTokens tagName="spring.property" paramName="list-value"> <value><XDtClass:currentToken/></value> </XDtClass:forAllClassTagTokens> </list> </XDtClass:ifHasClassTag> <XDtClass:ifHasClassTag tagName="spring.property" paramName="list-ref"> <list> <XDtClass:forAllClassTagTokens tagName="spring.property" paramName="list-ref"> <ref bean="<XDtClass:currentToken/>"/> </XDtClass:forAllClassTagTokens> </list> </XDtClass:ifHasClassTag> </property> </XDtClass:forAllClassTags> </bean> </XDtClass:forAllClassTags> </XDtClass:forAllClasses> <XDtMerge:merge file="spring-beans.xml"> <!-- To include additional bean definitions for Spring in the generated application context file, add a file to your XDoclet merge directory called spring-beans.xml that contains the <bean></bean> markup. --> </XDtMerge:merge> </beans>