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

                 如何让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>








转载于:https://my.oschina.net/frankies/blog/57342

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值