3

为什么依赖注入使用公共方法?如果我错了,请纠正我,但可以使用反射来更改实现。

4

5 回答 5

2

DI 本身并不是一个目标。DI 的目的是通过支持组合而不是继承来实现松散耦合,而这只有在您为此目的公开公共 API 时才有可能。

如果没有公共 API,您将无法以新的和现有的方式重构组件。

于 2011-04-16T17:46:12.080 回答
0

这是一个相当笼统的陈述,不是真的。我的偏好通常是使用包私有构造函数(或包私有类上的公共构造函数,因为这并不重要)进行依赖注入,因为它允许您自己实例化和注入一个类(没有反射或注入器)在同一包中的测试类中进行测试。

于 2011-04-16T16:56:30.513 回答
0

只是为了详细说明 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 中。

于 2011-04-16T18:58:02.907 回答
0

DI 框架有多种注入依赖项的方法

  • 构造函数注入
  • 二传手注入
  • 初始化注入
  • 场注入

通过使用前三个修饰符public,即使该类在 DI 框架之外使用,您也可以手动设置依赖关系。

然而,第四个选项被广泛使用。您可能需要手动设置依赖项的最常见场景是单元测试。例如,对于那个春天,提供了ReflectionTestUtils,这样您就可以用 1 行注入字段,这或多或少都很好。

于 2011-04-16T19:04:56.557 回答
0

请记住,即使通过反射 API,安全策略也可能会阻止调用受保护、包私有或私有方法。如果 DI 框架要在所有环境中工作,那么它只能依赖公共方法。

于 2011-04-16T18:08:25.673 回答