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