如何让xdoclet 的spring 标签支持java.util.Map类型属性的注入
(如需转载,请注明引用)
用过Xdoclet 工具的Spring 标签的人应该都知道: XDoclet支持的Spring方法注入包括:ref,list,name和value, 它是不支持java.util.Map类型注入的。 而Spring 是支持Map的注入的方法如下:
<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属性
/** * @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 也得做如下修改:
只需要在property 元素之内添加
<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 标签进行编程
(3) 为了要支持Velocity脚本语言,我这里引用 最新版本的veloctity1.7,则对应的相关引用jar 也得对应,我进行xdoclet 生成过程引用到的jar 如图
根据以上的配置之后,你应该就可以得到支持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>