在Spring中,您可以通过让applicationContext.xml调用构造函数来初始化bean,或者可以在bean上设置属性.这两种方法之间的权衡是什么?拥有一个构造函数(在一个方法中强制执行所需的一切)是否更好?或者更好地拥有所有属性(这使您可以灵活地仅选择性地注入,例如在单元测试时).
有什么权衡(在编写使用构造函数来建立它的初始状态的bean,或者使用属性以及可能是afterProperties()方法之间)?
我不确定有一种"最好"的方法来初始化bean.我认为每个人都有利弊,根据情况,其中一个可能是合适的.这当然不是一个详尽的清单,但这里有一些事情需要考虑.
使用构造函数允许您拥有一个不可变的bean.如果您可以在设计中使用它们,那么不可变对象就很好.它们不需要复制,序列化访问或线程之间的其他特殊处理.如果你有setter,你的对象不是不可变的.使用构造函数还可确保正确初始化对象.构造函数完成后,该对象有效.如果您的对象需要使用setter来初始化它,则可能存在无效对象.
另一方面,使用构造函数通常会导致伸缩问题.通常,您需要许多不同的构造函数,其中大多数将是另一个构造函数的超集.通常这些都是为了方便起见.例如:
public class Person { public Person(String name) { ... } public Person(String name, String phone) { ... } public Person(String name, String phone, String email) { ... } }
我非常喜欢的一个替代方案是Josh Bloch在JavaOne上提出的所谓的"增强"构建器模式.您可以在他的"Effective Java,Second Edition"一书中看到这一点.如果您查看模式的使用方式,它还将解决您的"afterProperties"方法问题.构建器模式将保证对象已正确初始化.
这是另一篇讨论模式的博客文章:http://www.screaming-penguin.com/node/7598
我不确定这符合你的春季要求,但总的来说,我是建筑师的忠实粉丝.