为什么Spring不支持直接的字段依赖注入(除了自动配置的)?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (12)

我对直接字段依赖注入感兴趣。传统上,Spring既支持构造函数注入(向构造函数提供参数),也支持基于setter的注入(调用时调用setter)。

然而,Spring也能够直接字段注入(设置对象的成员字段而不使用setter方法),这可以通过用@Autowired。自动装配仅限于“bean”,因此不能注入原始值(尽管可以通过创建类“java.lang.String”的bean来规避这种情况--这是有效的,但具有自动装配的一般警告)。除此之外,Spring还支持@Value从属性等直接将值设置为成员字段。

然而,Spring不允许将属性直接设置为成员字段(没有自动装配)。

提问于
用户回答回答于

@AUTOILED注释使用反射使私有字段可访问。我可以看到在Spring配置文件中没有使用它的三个原因。

  1. 由于配置是由bean属性(getter和setter)进行的,因此不能真正判断(在可能存在的情况下)是否需要调用setValue或设置成员值。
  2. 它破坏了封装。Spring配置没有理由知道私有成员变量。使用一个注释,这是可以的,因为它已经在源代码中了。
  3. 安全问题。更严格的安全管理器可能不允许通过反射访问私有字段。
用户回答回答于

我想我自己找到了答案。我转到Spring源代码,并看到了这些特性是如何实际实现的。这就是我发现的:

通过XML设置属性可能是Spring最古老的部分,它非常依赖于“java.bean”类进行内省、属性枚举等。很明显,那些根本不支持领域内省。最重要的是类型转换机制,它决定如何将属性值转换为有关属性的合适值。这里没有整齐可分的部分。

所有的@Autored等东西都是在BeanPostProcessor中实现的,它有自己的类型匹配机制,与类型转换无关。这也是为什么它只注入豆子的原因。对于@value来说,同样的事情也是一样的,它只是当场解决的,与属性无关。

因此,添加字段注入支持,特别是对属性的支持,并不是一项简单的工程工作,因为执行其中一项任务的代码部分几乎是完全独立的。

这并不能确切地回答“为什么?”,但我认为这是一个更有说服力的解释,为什么Spring没有添加直接字段依赖注入,而不是我听到的其他解释。除非他们有一些基本的东西来反对它(考虑到他们想要允许现有第三方类的配置,而不仅仅是JavaBean),否则这只是一个工程上的问题。

扫码关注云+社区