我读到(例如这里)如果我使用字段依赖注入,那么我就不能创建不可变的对象,但我不明白字段依赖注入是如何打破不可变的,我可以做下面的事情,可以创建不可变的SpringTest
,不是吗?
@Component
public final class SpringTest {
@Autowired
private Person person;
// here I will have no setter methods exposing "person" object but will only have getter methods for "person" object, ensuring defensive copying etc...
}
更新:请注意,我的问题是关于字段注入打破不变性的,所以我想知道我的上述代码片段(自从我最初的问题以来发生了变化,感谢@Andy和其他人纠正了它)是如何打破不变性的,我想不是,所以我认为这个答案是错误的,关于场注入的不变性。
不可变对象在构造之后不应该被修改。
Spring在构建对象后注入自动连接的私有字段。这与不变性原理相矛盾,因此不变性被打破。
但是,在通过构造函数注入进行自动连接的情况下,只要字段被声明为private final,我们就不会破坏不变性,因为这只会在对象构造期间将值设置为字段一次。
此外,如果Person对象是可变的,并且您有一个getter,那么它显然也打破了SpringTest的不可变性。
它是可变的,因为您可以自己(或从同一个包中的任何其他类)重新分配该字段。
仅仅打算不重新分配字段并不等同于不能这样做。
有谁能告诉我为什么@autowired表示不建议使用字段注入,而TextWriter对象“text”也表示无法自动连接,因为TextWriter类型的bean不止一个。我的密码。
问题内容: 我这样承诺 返回一个promise,yes 不能被修改 。 我如何在第一场比赛中脱颖而出?(除了显式抛出错误以外,还有其他方法吗?) 问题答案: 我想你不想在这里连锁。以同步的方式,您会写 这就是应如何将其转化为承诺: 诺言没有实现。
在处理高度并发的单例类的单元测试时,我偶然发现了以下奇怪的行为(在JDK 1.8.0\U 162上测试): main()方法的最后两行在INSTANCE的值上不一致-我猜JIT完全摆脱了该方法,因为该字段是静态final。删除final关键字可以使代码输出正确的值。 撇开你对单例的同情(或缺乏同情)不谈,暂时忘记像这样使用反射是在自找麻烦——我的假设是正确的吗?JIT优化是罪魁祸首?如果是这样的话
我正在开发一个spring boot应用程序。在这个应用程序中,我使用以下代码将application.properties创建为spring bean 是否可以在Application.Properties中不使用Https.port字段来运行场景1?
问题内容: 我尝试了这个: 只能得到: :声明前缺失 那么,我将如何打破JavaScript中的嵌套循环? 问题答案: 您应该能够打破标签,就像这样:
如何将单词显示到列单元格内的下一行。我尝试过,但它对我无效。在上面的代码,但它不起作用。