【发布时间】:2017-04-04 21:59:15
【问题描述】:
我熟悉传统设计模式中的依赖倒置原则,其中您有一个抽象产品,它在请求工厂方法的类中执行任务。但依赖注入的不同之处在于它使用注解来生成产品。
我正在审查这个Dagger 2 示例。这是最终结果:
// CoffeeApp.java
public class CoffeeApp {
@Singleton
@Component(modules = { DripCoffeeModule.class })
public interface Coffee {
CoffeeMaker maker();
}
public static void main(String[] args) {
Coffee coffee = DaggerCoffeeApp_Coffee.builder().build();
coffee.maker().brew();
}
}
$ java -cp ... coffee.CoffeeApp
~ ~ ~ heating ~ ~ ~
=> => pumping => =>
[_]P coffee! [_]P
我在这里无法理解这一行:
CoffeeMaker maker();
在 CoffeeMaker 类中,没有 make() 方法。那么这是如何工作的呢?
这是我的理解:
CoffeeMaker 类在其构造函数中使用@Inject 注解:
@Inject CoffeeMaker(Lazy<Heater> heater, Pump pump) {
this.heater = heater;
this.pump = pump;
}
这将迫使 Dagger 在实例化 CoffeeMaker 时实例化一个新的 Heater 和一个新的 Pump,对吗?还是只需要引用 CoffeeMaker 类本身?文件是这样说的:
当您请求 CoffeeMaker 时,它会通过调用 new CoffeeMaker() 并设置其可注入字段。
但是请求是什么意思?
当它说,它将设置它的可注入字段,我注意到 Heater 和 Pump 是接口。有一个带有 @Module 注释的对应 PumpModule 类。它包含方法providePump。
文件说:
The method’s return type defines which dependency it satisfies.
这是否意味着当调用@Inject CoffeeMaker 构造函数时,它会依次发现泵引用并搜索PumpModule @Module,然后发现providePump 并实例化一个Thermosiphon 类型的新泵?
【问题讨论】:
-
组件内部
maker()方法的解释请看this question
标签: java dependency-injection dagger-2