为什么依赖注入使用公共方法? 如果我错了,请纠正我,但是可以使用反射来改变实现。
答案 0 :(得分:2)
DI本身并不是一个目标。 DI的目的是通过支持组合优于继承来实现松散耦合,并且只有在为此目的公开公共API时才能实现。
如果没有公共API,您无法以新的和退出的方式重构组件。
答案 1 :(得分:0)
这是一个非常好的一揽子声明,但事实并非如此。我的偏好通常是使用包私有构造函数(或者包私有类上的公共构造函数,因为它并不重要),因为它允许你自己实例化和注入一个类(没有反射或注入器)在同一个包中的测试类中进行测试。
答案 2 :(得分:0)
请记住,安全策略可能会阻止用户通过反射API调用protected,package private或private方法。如果DI框架要在所有环境中工作,那么它只能依赖于公共方法。
答案 3 :(得分:0)
只是详细说明ColinD给出的答案(在编程Java一年之前,我从未知道包私有类)。使用DI框架开发的应用程序,我相信你会将接口公开,也许是一些抽象类和枚举:
package org.my.service;
public interface Service {
public void process();
}
然后,具体实现将是package-private(没有公共关键字)
package org.my.service;
class RealService {
public void process() {/*do something*/}
}
这强制执行信息隐藏的概念,并且意味着实现细节不会泄漏到公共API中。这也意味着你不能在该软件包之外使用该类(如果你尝试,编译时错误 - 你不能在任何地方“新”)。
再次如ColinD所说,你可以对它进行单元测试,因为你的单元测试将驻留在org.my.service中。
答案 4 :(得分:0)
DI框架有许多方法可以注入依赖项
通过使用前三个,使用修饰符public
,您可以手动设置依赖项,即使该类在DI框架之外使用。
然而,第四种选择被广泛使用。您可能需要手动设置依赖项的最常见方案是单元测试。例如,对于那个春天,提供ReflectionTestUtils
,这样你就可以注入1行的字段,这或多或少都很好。