Nak*_*ble 19 java spring dependency-injection
我对直接场依赖注入感兴趣.传统上,Spring支持构造函数注入(为构造函数提供参数)和基于setter的注入(在调用时调用setter).
但是,Spring也能够直接注入场景(在没有setter方法的情况下设置对象的成员字段),通过使用注释字段来证明@Autowired.自动装配仅限于"bean",因此无法注入原始值(虽然这可以通过创建类"java.lang.String"的bean来规避 - 这可行,但具有正常的自动装配警告.)除了这个,Spring支持@Value直接从属性等设置成员字段的值.
但是,Spring不允许将属性直接设置为成员字段(不使用自动装配).
我的问题是:为什么?
它显然有能力这样做,为什么不呢?是否有任何大的负面副作用阻止这种情况?或者这种能力是否有限,只有自动装配才有意义?它是否需要比调用setter更大的黑客攻击?
请注意,我不想讨论一般的setter和getter的相对优点,只是Spring做出这个选择的原因.
Nak*_*ble 10
我想我自己找到了答案.我转到Spring源代码,看看这些功能是如何实现的.这是我发现的:
通过XML设置属性可能是Spring最古老的部分,它非常依赖于"java.beans"类来进行内省,属性枚举等.显然,那些根本不支持字段内省.最重要的是类型转换机制,它确定如何将属性值转换为相关属性的合适值.这里没有整齐的可分离部分.
所有@Autowired等东西都是在BeanPostProcessor中实现的,它有自己的类型匹配机制,与类型转换无关.这也是它只注入豆类的原因.同样的事情对于@Value来说,它只是在那里现场解决的东西,与属性无关.
因此,为特性添加字段注入支持并不是一项简单的工程工作,因为执行其中一个或另一个的代码部分几乎是完全独立的.
这并不完全回答"为什么?",但我认为这是一个更引人注目的解释,为什么Spring没有添加直接场依赖注入,而不是我听过的其他解释.除非他们有一些根本的东西(我怀疑,考虑到他们想要允许配置现有的第三方类,而不仅仅是JavaBeans),那么只需要通过工程努力来获得功能.
@Autowired注释使用反射来访问私有字段(请参阅此相关问题).我可以看到为什么它没有在Spring配置文件中使用的三件事.
| 归档时间: |
|
| 查看次数: |
12174 次 |
| 最近记录: |