文档章节

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

小骏骏
 小骏骏
发布于 2012/05/14 17:37
字数 1037
阅读 676
收藏 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

没有更多内容

加载失败,请刷新页面

加载更多

李鸿章六百多字参倒豪门重臣,晚清第一奏折,藏尽顶级权谋话术!

道光二十七年(1847年),二十四岁的李鸿章高中进士,列二甲第十三名。 在此期间,有桩轶事挺有意思。 会试时,李鸿章的房师为当时的名士孙锵鸣。发榜后,孙锵鸣见自己这一房只考中了李鸿章、...

乔老哥
7分钟前
0
0
PTA-基础编程题目集-7-14 求整数段和

给定两个整数A和B,输出从A到B的所有整数以及这些数的和。 输入格式: 输入在一行中给出2个整数A和B,其中−100≤A≤B≤100,其间以空格分隔。 输出格式: 首先顺序输出从A到B的所有整数,每...

niithub
7分钟前
0
0
Spring Qualifier的使用

摘要 spring 的 qualifier 平常使用一般直接是使用id 来限定,不过spring给我们提供了更强大的功能。 使用方法 直接使用 直接在@Qualifier中限定bean的id 在bean上使用@Qualifier来指定后续使...

52iSilence7
10分钟前
0
0
【dup】和【pop】

dup: 复制栈顶元素并压入栈 pop: 出栈操作 代码 public class JvmTest1{    public static void testMethod(){ new JvmTest1();  }} 编译字节码文件 javap -c JvmTest1.cl...

时刻在奔跑
12分钟前
2
0
day179-2018-12-16-英语流利阅读-待学习

《海王》:上映 7 天,票房突破 9 亿,DC 要翻身? Daniel 2018-12-16 1.今日导读 这部电影堪称“有《阿凡达》般的视觉奇观,《指环王》般的史诗质感,《夺宝奇兵》般的寻宝历险,《狮子王》...

飞鱼说编程
20分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部