文档章节

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

小骏骏
 小骏骏
发布于 2012/05/14 17:37
字数 1037
阅读 672
收藏 0

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








© 著作权归作者所有

共有 人打赏支持
小骏骏
粉丝 8
博文 111
码字总数 22428
作品 0
厦门
高级程序员
myeclipse使用hibernate正向工程和逆向工程

1.myeclipse使用hibernate正向工程,hibernate的正向工程是指从java实体类生成数据库表的过程,这种过程符合java程序员面向对象编程的思想,也是工程设计的时候使用比较多的一种思想。具体实...

linsir
2010/06/29
0
0
Struts1.2+Spring2.5+Hibernate3.2框架搭建(十二)

/* * Generated by MyEclipse Struts * Template path: templates/java/JavaClass.vtl */ package com.zlk.struts.action; import java.io.IOException; import java.io.PrintWriter; import......

周禄康
2010/04/14
0
0
MyEclipse插件介绍与下载

1.Eclipse下载 EMF,GEF - Graphical Editor Framework,UML2,VE - Visual Editor都在这里下载 http://www.eclipse.org/downloads/index.php 1.lomboz J2EE插件,开发JSP,EJB http://forge.obje......

lyg945
2014/06/24
0
0
Spring学习笔记1——基础知识

1.在java开发领域,Spring相对于EJB来说是一种轻量级的,非侵入性的Java开发框架,曾经有两本很畅销的书《Expert one-on-one J2EE Design and Development》和《Expert one-on-one J2EE deve...

李长春
2011/10/09
0
0
Apache commons (Java常用工具包)简介

Apache Commons是一个非常有用的工具包,解决各种实际的通用问题,下面是一个简述表,详细信息访问http://jakarta.apache.org/commons/index.html BeanUtils Commons-BeanUtils 提供对 Java...

Coder小兵
2012/02/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Bash工作管理详解

Bash工作管理 Bash的工作是对具体任务的一个抽象表述,更确切的说是对管道的应用上的表述。Bash中的工作在形式上表现为一组相关进程或单个进程。工作进程组分为前台和后台,前台进程会对键盘...

小陶小陶
31分钟前
2
0
Qt那些事0.0.1

LIBS += -L$$PWD/lib/ -lStv1QMAKE_POST_LINK += $$QMAKE_COPY $$replace(PWD,"/","\\")\lib\Stv1.dll $$replace(OUT_PWD,"/","\\")\debug\Stv1.dll pro文件里,写起来按理说应该是轻松地......

Ev4n
40分钟前
2
0
如何正确的使用动态VPS(Linux)自动更换IP

背景 现在越来越多的人开始玩网赚项目,蚂蚁再小也是肉,薅羊毛的羊毛党越来越多,一些网赚项目也越来越受欢迎,但是一般的网赚项目都是要求真实用户的,所以要想获得大量的真实ip,一种动态...

bengozhong
46分钟前
2
0
分布式任务系统(LTS)部署学习使用

章节速览 背景介绍 环境部署 LTS架构原理&代码样例 个人心得经验 一、背景介绍 很多公司应该都会遇到job服务部署执行时:定时、并发、分布式这些问题。有的人就是只跑一个job服务,这样会简单...

硅步积千里
56分钟前
40
0
kotlin使用spring data redis(一)

1.引包 #忘记引用这个包的下场就是#nested exception is java.lang.NoClassDefFoundError: org/apache/commons/pool2/impl/GenericObjectPoolConfigcompile 'org.apache.commons:commons-p......

weidedong
59分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部