为什么依赖注入使用公共方法?

时间:2011-04-16 16:50:42

标签: java reflection dependency-injection public-method

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

5 个答案:

答案 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框架有许多方法可以注入依赖项

  • 构造函数注入
  • setter injection
  • 初始化程序注入
  • 现场注射

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

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

相关问题