可变性和弹簧

2022-09-02 01:41:50

我目前正在重读“Effective Java”,同时在一家大量使用Spring Dependency Injection的商店工作。在阅读布洛赫的书时,人们不禁会注意到他对类中不变性的强调(他多次指出类应该尽可能不可变)。我不禁觉得这与Spring Dependency Injection(以及大多数DI引擎)对javabeans标准的依赖直接冲突。阅读“Spring in Action”,关于DI的章节似乎会让布洛赫畏缩,因为他们的可变类由对象组成,这些对象实例化在你的权限之外,这些对象本身可能是可变的。

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


答案 1

事实上,春豆在思想上是不可变的,即使你没有强制执行这一点。

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

通常你不会这样做,但你永远不应该重新分配由DI框架注入的bean字段。这是因为春豆通常不具有任何状态,除了它们的依赖性(它们的范围是单例)。当然,也有例外,比如原型和请求范围的bean,这些都很少见(例如,在2个大项目和2个中型项目中,我只使用了1个原型范围的bean)。


答案 2

如果使用基于构造函数的注入,则可以使类保持不可变,并且仍使用依赖关系注入。这样,您就可以避免不必要的设置者。