Java:在XML中定义bean是一个好的实践方法吗?

5
在我正在工作的一个项目中,使用了Spring框架,有一些令我困惑的东西。显然,有些单元测试需要使用bean,而这些bean是从XML文件创建的,其中包含像这样的内容:
<bean class="...ListDTO">
 <constructor-arg>
  <map>
   <entry key="use1key">
    <value>use1value</value>
   </entry>
   <entry key="use2key">
    <value>use2value</value>
   </entry>
  </map>
 </constructor-arg>
 <constructor-arg>
  <map>
   <entry key="nature1key">
    <value>nature1value</value>
   </entry>
   <entry key="nature2key">
    <value>nature2value</value>
   </entry>
  </map>
 </constructor-arg>
 <constructor-arg>
  <value>false</value>
 </constructor-arg>
</bean>

发生了什么事?该类的构造函数...ListDTO已更改,因此从这个(在我看来非常冗长的)XML中似乎无法再创建bean。
有人能解释一下为什么将这种东西放在XML中而不是Java代码中是好的实践(真的吗?)?如果它在Java代码中,只要...ListDTO发生了变化,单元测试就会拒绝编译(即使单元测试实例化该bean的部分由于某种原因未执行)。
额外问题:除了运行所有单元测试、查看哪些单元测试失败并重复这个过程之外,是否有一种简便的方法可以轻松地找到所有这些破损的“XML中的bean”?
对我来说,这似乎是一个相当严重的问题,你可以更改构造函数,但IDE会表现得好像一切都很好:这是什么样的正当理由?(*)

(*) 和写: <constructor-arg><value>false</value></constructor-arg> 用于表示“false”的说法对我来说不太合适。 - Gugussee
3个回答

6
这个想法的背后是,你把环境之间的差异(开发、测试、生产)保存在一个中央的XML配置文件中,通过使用不同的配置文件来切换环境。
然而,使用bean配置来定义复杂的测试数据结构绝对不是一个好的做法。有人可能会在刚接触依赖注入时这样做,仅仅因为它是可能的。

+1... 这样就可以将需要“可移植”的内容保存在一个中央的 XML 配置文件中,同时不使用 beans 来定义复杂的测试数据结构,对吧? - Gugussee
@Gugussee:是的。大部分依赖注入应该通过注释来定义(特别是自动装配),XML配置应该简洁,并且只包含所有配置中存在且不同的内容。 - Michael Borgwardt

1
奖励问题:除了运行所有单元测试,查看哪些测试失败并反复执行之外,是否有一种简便的方法来轻松找到项目中所有这些破碎的“XML中的bean”?
Spring Tool Suite或Eclipse的Spring插件可以检查Spring配置文件是否正确(是否具有所有构造函数参数并且不使用未知的setter)。

+1,太好了...我会尝试适应Eclipse/Spring Tool Suite工具,以验证Spring配置文件。 - Gugussee

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接