我通常设法将我的课程设计为不可变类,所以我在编程压力方面有很多优点.
但是与Spring一起工作时,我有时会注意到,在大多数情况下,框架不鼓励这种设计,赞成经典的JavaBeans设计:默认的构造函数getter / setter.
我真的不喜欢JavaBean设计的对象,因为他们的疯狂的可变性.
所以我想知道我是否缺少一些东西
我尽量让我的课堂设计尽可能优雅和可重复使用,但框架需要改变这个设计或允许它,但是在一个困难的方式…
这是怎么回事?
解决方法
对于Web表单数据绑定(即形式POST),问题是Java反射在构造函数上很弱,因此难以在没有注释的情况下进行数据绑定.很久以前,我考虑提交一个Bug,Spring数据绑定应该利用被忘记的
@ConstructorProperties
(iirc我自己调查补丁,但是这很复杂,会打破很多事情).有人应该可以提交功能请求.
BTW我在谈论web数据绑定(而不是依赖注入),因为Spring已经很长时间支持基于构造函数的DI(不可变对象需要基于构造函数的注入).实际上,我会说基于构造函数的注入或(静态方法工厂)正在成为传统的getter / setter组件的首选方法(您可以看到这在许多Spring类中多年来一直转向final和constructor的变化).
无论如何,我能够使用Jackson https://gist.github.com/agentgt/4458079对不可变对象进行Web数据绑定
(尽管它使用Jackson来数据绑定请求不一定是JSON)
你可能还想看到Spring Webflow DataBinding to immutable objects via a constructor?我原来想到的想法,并有更多的信息.