注入私人,包或公共领域或提供二传手?

2022-09-02 23:44:48

我看到许多Java示例使用依赖注入和私有字段,而没有这样的公共设置器:

public SomeClass {
  @Inject
  private SomeResource resource;
}

但是,当注入应该手动执行时,例如在单元测试中,这是一个坏主意。

有几种可能性可以解决这个问题:

  • 添加一个公共 setter:setSomeResource(SomeResource r)
  • 公开字段
  • 使字段包受到保护

我想避开设置者,因为其中没有任何实际发生。所以我更喜欢公共或包保护。你有什么建议?


答案 1

避免为字段创建 setter 的一种方法是使用构造函数注入。这甚至允许您将字段声明为最终字段。

它是这样的:

public class SomeClass {
    private final SomeResource resource;

    @Inject
    public SomeClass(SomeResource resource) {
        this.resource = resource;
    }
}

答案 2

添加 setter 不是最佳解决方案,因为您正在添加不需要的生产代码。

另一种方法是使用Spring的ReflemationTestUtils类来注入使用refreprem的测试依赖项,请参阅 http://static.springsource.org/spring/docs/2.5.x/api/org/springframework/test/util/ReflectionTestUtils.html

编辑(2017):但是,反射是比添加设置器更糟糕的解决方案。造成这种混乱的原因是,Spring可以在没有 setter 或构造函数的情况下注入值。我目前的立场是坚持使用其中任何一种,避免使用黑魔法注射方法。