基于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机制甚至可以在编译期对属性内容的格式进行特殊的校验.

你可能感兴趣的:(spring,工作,xml)