文档章节

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

小骏骏
 小骏骏
发布于 2012/05/14 17:37
字数 1037
阅读 672
收藏 0
点赞 0
评论 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
struts1.2实现图片上传

Action: public class FileUploadAction extends Action { /* * Generated Methods / /* * Method execute * @param mapping * @param form * @param request * @param response * @return ......

九爷
2011/06/12
0
0
Apache commons (Java常用工具包)简介

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

Coder小兵
2012/02/04
0
0
maven教程--结合eclipse

maven教程--结合eclipse 概念与优势 maven是一种非常流行的项目管理工具,它将项目依赖的jar包都变成了配置文件---pom.xml。 maven通过pom文件读取需要哪些依赖包,然后到网上mavenReposito...

sekaiga
2017/10/30
0
0
成为Java高手的25个学习目标

你已经掌握了这25条中的多少条了呢? 1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该了解UML,尤其是 class,object,interaction以及statediag...

thinkyoung
2014/11/01
0
0
成为Java高手的25个学习要点

你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该了解UML,尤其是class、object、interaction以及statediagrams。 2. 你需要学习Java语言的基础知识以及它...

lw_tao
2014/04/03
0
2
成为Java高手需要注意的25个学习目标

1.你需要精通面向对象分析与设计(OOA/OOD)、涉及模式(GOF,J2EEDP)以及综合模式。你应该了解UML,尤其是class,object,interaction以及statediagrams。 2.你需要学习Java语言的基础知识以及...

孙启超
2012/03/19
0
2

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Xamarin Essentials教程地理定位Geolocation

Xamarin Essentials教程地理定位Geolocation 通过地理定位功能,应用程序可以获取用户的当前地理位置,如经纬度值。利用地理位置,可以在地图上定位,也可以转化物理位置,划分用户的归属地。...

大学霸
6分钟前
0
0
vue 编译警告 Compiled with 4 warnings

There are multiple modules with names that only differ in casing. This can lead to unexpected behavior when compiling on a filesystem with other case-semantic. Use equal casing.......

落雪飞声
10分钟前
0
0
开篇文章,长期记录安全情形

密码位置 密码位于注释中 密码位于服务器端文件中 通过访问根目录下.htaccess、robots.txt查看禁查路径 密码文件可能存在的路径:/、/extra/、/extras/ 密码加密 binary to base16 sha256 彩虹...

hirainn
23分钟前
0
0
mysql数据库设置root可以远程登录的方法

mysql数据库设置root可以远程登录的方法 Posted on 2018-02-21 21:08 sishuisufeng 阅读(161) 评论(0) 编辑 收藏 允许root用户在任何地方进行远程登录,并具有所有库任何操作权限,具体操作如...

rootliu
27分钟前
0
0
TensorFlow 图的基本操作

图的创建,一般只需要使用默认图就能满足大部分的需求了 # 1 创建图的方法# 在默认图中创建常量c = tf.constant(0.0)# 新建一个图g = tf.Graph()# 设置上下文管理器,标明操作...

阿豪boy
今天
0
0
git 忽略文件失效

git update-index --assume-unchanged */.project

林子大鸟
今天
1
0
实现验证码功能

1、实现验证码,并存储 import com.dtb.pc_enterprise.entity.EnterUserEntity;import com.dtb.pc_enterprise.service.AdminService;import com.dtb.pc_enterprise.util.RedisService;......

木九天
今天
0
0
iptables 实例

以下部分内容为网络查询并整理结果 filter表小案例 iptables规则五条链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING 四个表:filter nat mangle raw ###netfilter和iptables说明: 1、 ne...

李超小牛子
今天
0
0
Java面试基础篇——第六篇:常见Map类的区别

常见的map类有: HashMap, ConcurrentHashMap (Jdk1.8) , LinkedHashMap, TreeMap, Hashtable。 其中我们最常用的莫过于HashMap, 和并发情况下使用的ConcurrentHashMap了,它们的主要区别就在...

developlee的潇洒人生
今天
2
0
spring-boot:run启动时,指定spring.profiles.active

Maven启动指定Profile通过-P,如mvn spring-boot:run -Ptest,但这是Maven的Profile。 如果要指定spring-boot的spring.profiles.active,则必须使用mvn spring-boot:run -Drun.profiles=test......

夜黑人模糊灬
今天
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部