文档章节

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

小骏骏
 小骏骏
发布于 2012/05/14 17:37
字数 1037
阅读 677
收藏 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
大家说说有什么好点儿的java代码生成

不是普通的把数据库映射成java类,是那种可以生成SSH代码的,如可以生成DAO层,BIZ层啦,ACTION啦~ 还可以基于模板定制,可以规范代码,节省开发人员的开发时间。 有经验的大牛们,提个建议,...

baiivan
2010/05/20
466
4
AppFuse 3.5 发布,Web 应用框架

AppFuse 3.5 发布,此版本包括大量的改进,主要更新内容: 为 Wicket 提供 CRUD 生成支持 升级至 Tapestry 5.4 集成 Spring IO Platform,进行依赖管理 重构单元测试,使用 JUnit 4 重命名 ...

oschina
2015/12/31
4.2K
5
MyEclipse Enterprise Workbench - v7.0 M2

MyEclipse 7.0 M2包括Eclipse 3.4/Ganymede, Ajax for JEE, Windows Vista, Java EE 5, Java 6, Maven 2, Portlets, Spring 以及 JSF 更新and JAX-WS Web服务支持等。 这些新的特性在7.0 M2各......

oschina
2008/09/24
1K
1
APPFuse--create DAO

在JAVA世界中,有一个名词,POJO(Plain Old Java Object)。一个对象被创建的同时,还有几个其他类来从数据库中persist(保存/获取/删除)它。这个对象被称作POJO对象 下面示例使用Hibernate。 ...

晨曦之光
2012/05/21
78
0

没有更多内容

加载失败,请刷新页面

加载更多

CentOS7 64位安装MySql教程

CentOS7 64位安装MySql教程 先检查系统是否装有mysql rpm -qa | grep mysql 下载mysql的repo源 wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm 报错: -bash: wget: ......

须臾之余
17分钟前
1
0
Python 网络爬虫(新闻采集脚本)

=====================爬虫原理===================== 通过Python访问新闻首页,获取首页所有新闻链接,并存放至URL集合中。 逐一取出集合中的URL,并访问链接获取源码,解析出新的URL链接添...

阿锋zxf
30分钟前
1
0
JavaScript继承(六)——寄生组合式继承

JavaScript继承(三)——组合继承中讲到,组合继承是JavaScript中最常用的继承模式,但是它也有自己的不足之处,现在我们就来剖析它的不足,如下示例: function Human(name){ this.name ...

Bob2100
35分钟前
1
0
一文说尽MySQL事务及ACID特性的实现原理

本文将首先介绍 MySQL 事务相关的基础概念,然后介绍事务的 ACID 特性,并分析其实现原理。MySQL 博大精深,文章疏漏之处在所难免,欢迎批评指正。 MySQL 事务基础概念 事务(Transaction)是访...

架构师springboot
今天
8
0
Vue +Element UI后台管理模板搭建示例

一、蓝色主题 Element ui 后台管理 Demo https://github.com/taylorchen709/vueAdmin https://taylorchen709.github.io/vueAdmin/#/user Element ui 文档 http://element.eleme.io/#/zh-CN/......

tianma3798
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部