可变性和春天

nsf*_*n55 21 java spring immutability

我目前正在一家大量使用Spring Dependency Injection的商店里重读"Effective Java".在阅读布洛赫的书时,人们不禁会发现他对课堂不变性的强调(他多次表示课程应尽可能不变).我不禁感到这与Spring Dependency Injection(以及大多数DI引擎)对javabeans标准的依赖直接冲突.阅读"Spring in Action"关于DI的章节似乎会让Bloch畏缩他们的可变类,这些类由在你职权范围之外实例化的对象组成,这些对象本身就是可变的.

是不是Bloch的想法对于Spring来说太新颖了?Spring模型被破坏了吗?Bloch对不变性的立场是否仅适用于编写库代码?在编写Spring代码时,我应该编写带有大量getter和setter的灵活对象,还是在构造函数中加载所有内容?

Boz*_*zho 11

事实上,即使你没有强制执行,春天豆也是不可改变的.

您只能为final通过构造函数注入初始化的字段提供getter .

通常你不会这样做,但你永远不应该重新分配由DI框架注入的bean字段.那是因为除了它们的依赖关系之外,spring bean通常不会保持任何状态(并且它们的范围是单例).当然,有一些例外,例如原型和请求范围的bean,这些是罕见的(例如在2个大型和2个中型项目中,我只使用了1个原型范围的bean)

  • 我同意:大多数Spring instanciated对象是"singleton"而不是真正"可变"(服务,daos,controller,transactionManagers,......). (3认同)

Pau*_*kin 9

如果使用基于构造函数的注入,则可以使类保持不可变并仍使用依赖注入.这样你可以避免不必要的setter.