[Java] 解决spring的xml标签内不能自由增加说明的难题,方便调试、部署时进行批量屏蔽
作者:zyl910
以往我们想在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] 解决spring的xml标签内不能自由增加说明的难题,方便调试、部署时进行批量屏蔽的更多相关文章
- Java Map转成xml标签字符串
一个简单的java实现,供参考: package com.trilogy.session.data; import java.lang.reflect.Field; import java.util. ...
- spring web.xml 标签<param-name>contextConfigLocation</param-name>
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</lis ...
- spring自定义xml标签&自定义注解
public class YafBeanDefinitionParser implements BeanDefinitionParser { private BeanDefinitionRegistr ...
- Android项目部署时,发生AndroidRuntime:android.view.InflateException: Binary XML file line #168: Error inflating class错误
这个错误也是让我纠结了一天,当时写的项目在安卓虚拟机上运行都很正常,于是当我部署到安卓手机上时,点击登陆按钮跳转到用户主界面的时候直接结束运行返回登陆界面. 当时,我仔细检查了一下自己的代码,并 ...
- Spring框架 全注解annotation不使用配置文件(SpringConfiguration.java类代替) 补充 xml配置文件没有提示解决
全注解不使用配置文件 首先还是倒包 在原有的jar包: 需Spring压缩包中的四个核心JAR包 beans .context.core 和expression 下载地址: https://pan.b ...
- 6.2 dubbo在spring中自定义xml标签源码解析
在6.1 如何在spring中自定义xml标签中我们看到了在spring中自定义xml标签的方式.dubbo也是这样来实现的. 一 META_INF/dubbo.xsd 比较长,只列出<dubb ...
- spring:使用<prop>标签为Java持久属性集注入值
spring:使用<prop>标签为Java持久属性集注入值 使用 spring 提供的<prop>为Java持久属性集注入值,也就是向 java.util.Propertie ...
- 使用idea搭建maven项目时 java目录下的xml文件没有加载的解决方法
今天在idea集成开发环境下 使用maven搭建了ssm项目,遇到了3个问题 首先我们先复习一下知识点: 第一步:在web.xml中配置spring监听器 <!-- spring监听器 加载sp ...
- java web 加载Spring --web.xml 篇
spring是目前最流行的框架.今天谈谈对spring的认识 起步 javaweb中我们首先会遇到的配置文件就是web.xml,这是javaweb为我们封装的逻辑,不在今天的研究中.略过,下面是一个标 ...
随机推荐
- tomcat 支持ssi功能配置
1.SSI是Server Side Includes 的缩写,是嵌入到HTML页面的一组指令的集合.在返回请求的页面(包含SSI指令前),服务器会处理这些指令,并用处理的结果替换指令,然后把页面返回. ...
- Echarts动态加载后台数据
注意:1.用Ajax请求获取后台数据 2.Echarts只能处理Json数据 后台Controller:根据业务需求不同而返回不同数据,我前台要循环遍历Echarts的series进行数据添加,所以后 ...
- Restful风格API接口开发springMVC篇
Restful风格的API是一种软件架构风格,设计风格而不是标准,只是提供了一组设计原则和约束条件.它主要用于客户端和服务器交互类的软件.基于这个风格设计的软件可以更简洁,更有层次,更易于实现缓存等机 ...
- VS 控件命名规范
基本数据类型 数据类型 数据类型简写 标准命名举例 Array arr arrShoppingList Boolean bln blnIsPostBac ...
- JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)
一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- mysql增加普通用户后无法登陆问题的解决方法
解决方法: 增加普通用户后,执行: mysql> use mysql mysql> delete from user where user=''; mysql> flush priv ...
- 安装SQLSERVER2012遇到的一些问题
安装SQLSERVER2012遇到的一些问题 先到MSDN我告诉你http://msdn.itellyou.cn/下载安装包,我每次都到MSDN我告诉你里下载的,因为那里的安装包保证能用 我的环境是: ...
- [51单片机] TFT2.4彩屏2 [32*32文字显示]
>_<:同理如果想显示其他形式的字体,就要建立相应的库啦,如这里还有一个gb3232的汉字库:GB3232.h // ------------------ 汉字字模的数据结构定义 ---- ...
- html中a标签href属性的一个坑
由于公司需要,小菜最近在搞app web开发,目前只有ios和android版本,虽然仅此两个版本,但是依然要考虑浏览器兼容性问题,因为android和ios默认浏览器内核是不一样的. 先说说兼容性问 ...
- JAXB玩转命名空间
声明:如果你正在发愁xml命名空间及其前缀问题,那么请继续,否则请跳过 本文讲解使用jaxb结合dom4j的XMLFilterImpl过滤器实现序列化和反序列化的完全控制 主要实现以下功能 序列化及反 ...