繁体   English   中英

注入依赖关系的正确方法?

[英]Proper way of injecting dependencies?

哪一种是注入依赖项的最佳方法? 为什么? 两者有什么区别?

public abstract class Service {

    private IConfig config;

    @Inject
    public Service(IConfog config) {
        this.config = config
    }
}

要么

public abstract class Service {

    @Inject private IConfig config;

    @Inject
    public Service() {

    }
}

构造器注入(1st)比setter注入更为可取,因为它可以更轻松地支持“不变的”实体或行为明确且在构造后不可修改的实体。 构造函数与二传手注入

对我来说,经验法则是首先喜欢构造函数注入,如果构造函数注入需要我弯腰(例如,在使用“ OOP getter and setter”方法处理旧代码时),则跳到setter注入。

编辑:我假设您正在尝试在“构造函数”和“ setter”构造函数之间做出选择。 但是似乎您正在使用无法实例化的抽象类。 也许您还有其他想法吗?

首先,我没有在抽象类中添加与注入相关的注释-在我看来,如果实际上无法实例化某事物,则没有决定应该如何实例化的想法(当然,这只是我的观点,其他人可能同意或不同意) )。

通常,我通过以下方式进行操作:

public abstract class AbstractService {

  private IConfig config;

  public AbstractService(IConfog config) {
    this.config = config
  }
}

public class Service extends AbstractService {
  @Inject
  public Service(IConfig config) {
    super(config);
  }
}

现在,您可以同时使用带或不带依赖项注入的两个类(手动构造它,传递所有必需的引用)。 您还可以确保每次都以适当的状态实例化Service。

依赖注入的主要目的是通过允许

Service serviceToTest = new Service(mockConfig);

要么

Service serviceToTest = new Service();
serviceToTest.setConfig(mockConfig);

注入依赖项的第二种方法使其无法执行上述操作。 您只能通过让Guice创建服务并注入模拟依赖项或使用反射来设置模拟依赖项来对其进行测试。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM