[Java] 解决spring的xml标签内不能自由增加说明的难题,方便调试、部署时进行批量屏蔽
2016-01-13 22:02
411 查看
作者:zyl910
以往我们想在spring的xml配置文件中增加说明文本时,只能使用xml注释(
上面就是利用了xml注释,来存储该bean的说明。虽然清晰,但它占用了xml注释。
xml规定注释不能嵌套。于是若想批量屏蔽一些bean时,得细心跳过原来的xml注释说明部分,单个单个给注释掉。不但要花很多功夫,且一不小心容易造成xml注释不匹配,整个文件失效。
故考虑不再使用xml注释来填写说明文本。
但是该办法是行不通的。因spring会检查xml标签内的特性,若发现其他特性便会报错退出。于是我们只能另外想办法。
想到这个bean配的是我们自己的类,故我们可以在自己的类里加一个“title”属性(property),然后在xml里配置该bean的属性。例如——
现在就又存在这样问题——想为“triggers”里的项目增加说明该怎么办?
因为根据调试、部署需要,triggers里的定时器是经常需要使用xml注释来批量控制启停的。如果用xml注释写说明,就没法批量启停了。
其次,先前也试过,spring标签里不能加特性(attribute)。
第三,这里用的是ref标签,故不能像先前对bean标签那样加个属性(property)来解决.
第四,这里是在list内加定时器,故不能用其他spring标签放其他类型的数据.
在网上搜索了很久,发现spring支持xml扩展,但该方案不适合我们项目。因为那种方法对项目配置改动较多。而对于大型项目来说,是拆分为许多个子项目,若用spring扩展的话影响太大了,其他子项目不一定同意这样的更改,没法形成统一方案。
新建一个“TitleProxyFactoryBean”类,它继承自spring的“ProxyFactoryBean”类,并提供title等属性。代码如下——
然后在配置文件中便可以用代理的方式引用bean,并可填写说明。例如——
测试通过。
此时可做2点改进——
使用spring的p来配置,它比property标签精简很多。
将重要属性放在前面,而class等无需改的放后面。
例如——
优化后测试通过。
(完)
源码地址: https://coding.net/u/zyl910/p/zyllibj/git
以往我们想在spring的xml配置文件中增加说明文本时,只能使用xml注释(
<!-- 注释 -->)。这对于“调试、部署时想批量屏蔽部分bean”是不利的。于是本文讨论如何解决这个难题,并给出一个对项目配置改动少的方案。
一、最初问题
例如现在想用quartz管理一个定时器类,故需要先在spring的xml配置文件中把该定时器类(JobTest)配置为bean。一般是这样写——<!-- 测试Job. --> <bean id="jobTest" class="org.zyl910.zyllibj.test.spring.JobTest" />
上面就是利用了xml注释,来存储该bean的说明。虽然清晰,但它占用了xml注释。
xml规定注释不能嵌套。于是若想批量屏蔽一些bean时,得细心跳过原来的xml注释说明部分,单个单个给注释掉。不但要花很多功夫,且一不小心容易造成xml注释不匹配,整个文件失效。
故考虑不再使用xml注释来填写说明文本。
二、最初问题的解决办法
首先尝过在bean标签内直接增加一个特性(attribute)来填写说明,例如——<bean id="jobTest" class="org.zyl910.zyllibj.test.spring.JobTest" title="测试Job" />
但是该办法是行不通的。因spring会检查xml标签内的特性,若发现其他特性便会报错退出。于是我们只能另外想办法。
想到这个bean配的是我们自己的类,故我们可以在自己的类里加一个“title”属性(property),然后在xml里配置该bean的属性。例如——
<bean id="jobTest" class="org.zyl910.zyllibj.test.spring.JobTest"> <property name="title" value="测试Job"/> </bean>
三、真正难题
用quartz管理定时器时,除了需配置类的bean外,还需要配置方法、触发器的bean,最后还要配置调度器。例如——<bean id="jobTest" class="org.zyl910.zyllibj.test.spring.JobTest"> <property name="title" value="测试Job"/> </bean>
<bean id="jobTest_process" class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">
<property name="targetObject" ref="jobTest"/>
<property name="targetMethod"><value>process</value></property>
<property name="concurrent" value="false"/>
</bean>
<bean id="jobTest_processTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean">
<property name="jobDetail" ref="jobTest_process"/>
<property name="cronExpression" value="* 0/1 * * * ?"/>
</bean>
<bean class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
<property name="triggers">
<list>
<ref bean="jobTest_processTrigger"/>
</list>
</property>
</bean>
现在就又存在这样问题——想为“triggers”里的项目增加说明该怎么办?
因为根据调试、部署需要,triggers里的定时器是经常需要使用xml注释来批量控制启停的。如果用xml注释写说明,就没法批量启停了。
其次,先前也试过,spring标签里不能加特性(attribute)。
第三,这里用的是ref标签,故不能像先前对bean标签那样加个属性(property)来解决.
第四,这里是在list内加定时器,故不能用其他spring标签放其他类型的数据.
在网上搜索了很久,发现spring支持xml扩展,但该方案不适合我们项目。因为那种方法对项目配置改动较多。而对于大型项目来说,是拆分为许多个子项目,若用spring扩展的话影响太大了,其他子项目不一定同意这样的更改,没法形成统一方案。
四、解决方案
我对着spring的官方文档、源码看了很久,最终想出来了一套简单有效的解决方案。新建一个“TitleProxyFactoryBean”类,它继承自spring的“ProxyFactoryBean”类,并提供title等属性。代码如下——
package org.zyl910.zyllibj.spring; import org.springframework.aop.framework.ProxyFactoryBean; /** 带标题的代理Bean工厂. * * <p>由于spring的xml里不能直接加特性写注释,且spring的xml扩展机制对项目改动较大. 故制定了此类来实现为bean加说明的功能.</p> * * 提供了3个可选属性: * <ul> * <li>String title: 标题. 可用于介绍该bean是什么.</li> * <li>String group: 组. 有时需要对bean进行分组,此时可把分组说明填这里.</li> * <li>Object tag: 标记. 可用根据需要填充任意内容.</li> * </ul> * * @author zyl910 * */ public class TitleProxyFactoryBean extends ProxyFactoryBean { private static final long serialVersionUID = -4213438026061725669L; /** 标题. 可用于介绍该bean是什么. */ private String title; /** 组. 有时需要对bean进行分组,此时可把分组说明填这里. */ private String group; /** 标记. 可用根据需要填充任意内容. */ private Object tag; /** 取得标题. * @return the title */ public String getTitle() { return title; } /** 设置标题. * @param title the title to set */ public void setTitle(String title) { this.title = title; } /** 取得组. * @return the group */ public String getGroup() { return group; } /** 设置组. * @param group the group to set */ public void setGroup(String group) { this.group = group; } /** 取得标记. * @return the tag */ public Object getTag() { return tag; } /** 设置标记. * @param tag the tag to set */ public void setTag(Object tag) { this.tag = tag; } }
然后在配置文件中便可以用代理的方式引用bean,并可填写说明。例如——
<bean class="org.zyl910.zyllibj.spring.TitleProxyFactoryBean"><property name="target" ref="jobTest_processTrigger"/><property name="title" value="测试Job"/></bean>
测试通过。
五、配置优化
上面的方案虽然能解决问题,但是太长了,不易读。此时可做2点改进——
使用spring的p来配置,它比property标签精简很多。
将重要属性放在前面,而class等无需改的放后面。
例如——
<bean p:target-ref="jobTest_processTrigger" p:title="测试Job" class="org.zyl910.zyllibj.spring.TitleProxyFactoryBean" />
优化后测试通过。
(完)
源码地址: https://coding.net/u/zyl910/p/zyllibj/git
相关文章推荐
- 【java web】--Ajax异步判断用户名是否存在
- 从头认识java-17.4 详解同步(4)-同步阻塞、synchronized和volatile
- SpringMVC——Controller接口
- eclipse怎么设置字体大小
- java.lang.ClassNotFoundException: com.fasterxml.jackson.core.JsonProcessingException
- eclipse怎么设置字体大小
- Eclipse 中的重构功能
- JDK 7 中的 Fork/Join 模式
- Eclipse 中的重构功能
- java流与文件——读写二进制数据(DataOutput + DataInput)
- java学习笔记01——基础知识
- Java中有关构造函数的一道笔试题解析
- 构建MAVEN项目
- Java SE7新特性之try-with-resources语句
- java中super用法
- 一月13日 JAVA基础课
- RandomAccessFile类解析
- 【Java】java日历
- Java多线程——Thread 和 Runnable
- WebService学习总结(三)——使用JDK开发WebService