您的位置:首页 > 编程语言 > Java开发

如何让xdoclet 的spring 标签支持java.util.Map类型属性的注入

2012-05-14 00:00 651 查看
如何让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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  xdoclet spring map
相关文章推荐