基于XBean简化spring配置文件

昨天看到一篇文章, Craig Walls介绍了一种利用XBean简化spring配置文件的做法. spring配置文件的功能很简单, 其语法规定也相对简明, 手工编写起来并不算困难, 但是写的多了也有人觉得冗长不堪. Craig Walls的方法大致相当于是引入一种自定义标签机制来增强表达能力(expressive).

标准的配置方式如下:
<beans>
<bean id="quest"
class="com.springinaction.chapter01.knight.HolyGrailQuest"/>

<bean id="knight"
class="com.springinaction.chapter01.knight.KnightOfTheRoundTable">
<property name="moniker">
<value>Bedivere</value>
</property>
<property name="quest">
<ref bean="quest"/>
</property>
</bean>
</beans>

通过org.xbean.spring.context.XmlWebApplicationContext, 我们可以使用如下方式:
<beans xmlns:k="java://com.springinaction.chapter01.knight">
<k:HolyGrailQuest id="quest" />

<k:KnightOfTheRoundTable id="knight" moniker="Bedivere">
<property name="quest" ref="quest" />
</k:KnightOfTheRoundTable>
</beans>
在这种方式中, property, value等spring特定的结构描述标签被具有明确业务含义的moniker等名字所代替, 写法变得更加紧凑也更加自然, 标签的语义表达能力得到了很大的提高.

以上的方法中存在一个问题, 即自定义标签的属性名可能和spring内置的属性名冲突, 例如上例中id属性所指定的是spring所使用的id值, 而不是KnightOfTheRoundTable类的属性. 为了解决名字冲突的问题, Craig Walls选择了在外部的propreties文件中增加描述信息, 例如
# The default package
package = com.springinaction.chapter01.knight
knight = com.springinaction.chapter01.knight.KnightOfTheRoundTable
quest = com.springinaction.chapter01.knight.HolyGrailQuest
knight.myQuest=quest

此后可以使用
<beans>
<knight id="knight" moniker="Bedivere"
xmlns="http://springinaction.com/schemas/knight">
<myQuest><quest/></myQuest>
</knight>
</beans>
myQuest是对quest属性的重命名.

不过在我看来, 这种依赖外部文件的方法没有什么必要. 我的建议是将spring内置标签与自定义标签同等对待, 因而spring标签也处在某一特定名字空间s中, 这样就可以避免名字冲突.
<beans xmlns:k="java://com.springinaction.chapter01.knight">
<k:KnightOfTheRoundTable s:id="knight" moniker="Bedivere">
<quest><k:HolyGrailQuest/></quest>
</k:KnightOfTheRoundTable>
</beans>

以上例子中s:id所指定的就是spring所需要的id值, s是spring标签所在的名字空间.
另外, 我认为引入类名简写是没有什么必要的, 因为类名本身就应该能够揭示其用途, 而不需要一个更加富有表现力的名字. 而考虑到spring作为组件装配工厂的用途, 在装配的过程中我们应该拥有对于所装配组件的明确知识, 应该清晰的意识到自己在操纵哪个实现类. 如果我们定义了一个简写名字, 那就是多了一个附加层, 增加了不必要的概念转换负担, 而且模糊了我们对于系统本身的认识.
我一直坚持xml是人机共享的信道, 应该是人与机器都能够读懂的语言. 本来xml相对于html的进步就在于它并不是规定了一些预定义的标签, 而是仅仅定义了标签的语法, 允许通过自定义标签来描述信息结构. 我们不应该浪费xml的这种描述能力. 虽然spring的功能比较单一, 引入自定义标签的优点可能不是那么明显, 但是在更复杂的环境中, 我们的经验证明这是绝对有益的. 在witrix平台的配置文件中, 我们大量使用了tpl模板技术, 通过tpl的自定义标签机制对外提供一些Domain Specific的功能标签, 大大增强了xml标签的语义表达能力. 例如, 在工作流配置中, 我们可以定义如下标签
<util:发送邮件通知 接收人="${receiver}" 内容="xx工作已就绪" />
当标签名或者属性名写错的时候, 在编译期就可以诊断出来并抛出异常, 通过cp:run机制甚至可以在编译期对属性内容的格式进行特殊的校验.
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值