Dagger——Android的依赖注入框架
2015-02-22 21:50
369 查看
Dagger-快速依赖注入器
这个框架它的好处是它没有采用反射技术(Spring是用反射的),而是用预编译技术,因为基于反射的DI非常地耗用资源(空间,时间)。这里记录一下上面文章的一些关键的要点
Dagger
构造应用程序的类对象,并组合其依赖关系。 Dagger使用
标记那些需要依赖注入的构造函数和成员变量。
Dagger将使用
注意,当类中含有@Inject注释的成员变量, 却没有@Inject注释的构造函数时, Dagger将使用类的默认构造函数。若类中缺少@Inject注释, 该类是不能由Dagger创建的。这这个例子中,因为Thermosiphon类中有@Inject注释的构造函数,当有数要构建这个类对象的时候,就使用这个@Inject注释的构造函数来构建类的对象。
Dagger不支持函数注入。
默认情况下, Dagger 通过构造相应类型的对象来实现依赖关系。当请求一个CoffeMaker对象时, Dagger将调用new CoffeeMaker()构造函数,
并赋值给@Inject标记的成员变量。
但是@Inject并不是在任何情况下都可以:
接口类型不能被构造
第三方的类不能被注释构造。
可配置的对象必须被配置好
对那些使用@Inject效率极低的情况,
可以使用@Provides注释函数来实现依赖关系。这些函数的返回类型定义其实现的依赖关系。
例如,
当需要一个Heater时, Dagger将调用provideHeater()函数获取。
@Provides注释的函数也可以有他们自己的依赖关系。下面这个Provides函数依赖于一个Thermosiphon对象:
注意,通常情况下, 约定@Provides函数以provide作为前缀, @Module类以Module作为后缀。
@Inject 和 @Provides 注释的类构建了一个对象图表。这些对象与对象之间通过依赖关系相互关联。通过函数
这个函数可以接受一个或多个Module作为参数:
这个框架它的好处是它没有采用反射技术(Spring是用反射的),而是用预编译技术,因为基于反射的DI非常地耗用资源(空间,时间)。这里记录一下上面文章的一些关键的要点
声明依赖关系
Dagger构造应用程序的类对象,并组合其依赖关系。 Dagger使用
javax.inject.Injectannotation
标记那些需要依赖注入的构造函数和成员变量。
Dagger将使用
@Inject 注释的构造函数创建类对象。 当请求构建新的类对象时, Dagger 将自动获取相应的参数, 并调用构造函数。
class Thermosiphon implements Pump { private final Heater heater; @Inject Thermosiphon(Heater heater) { this.heater = heater; } ... }
class CoffeeMaker { @Inject Heater heater; @Inject Pump pump; ... }Dagger 可以直接注入成员变量。在这个例子中, 它获取Heater对象, 并注入到成员变量heater,,获取Pump对象并注入到成员变量pump。
注意,当类中含有@Inject注释的成员变量, 却没有@Inject注释的构造函数时, Dagger将使用类的默认构造函数。若类中缺少@Inject注释, 该类是不能由Dagger创建的。这这个例子中,因为Thermosiphon类中有@Inject注释的构造函数,当有数要构建这个类对象的时候,就使用这个@Inject注释的构造函数来构建类的对象。
Dagger不支持函数注入。
实现依赖关系
默认情况下, Dagger 通过构造相应类型的对象来实现依赖关系。当请求一个CoffeMaker对象时, Dagger将调用new CoffeeMaker()构造函数,并赋值给@Inject标记的成员变量。
但是@Inject并不是在任何情况下都可以:
接口类型不能被构造
第三方的类不能被注释构造。
可配置的对象必须被配置好
对那些使用@Inject效率极低的情况,
可以使用@Provides注释函数来实现依赖关系。这些函数的返回类型定义其实现的依赖关系。
例如,
当需要一个Heater时, Dagger将调用provideHeater()函数获取。
@Provides Heater provideHeater() { return new ElectricHeater(); }
@Provides注释的函数也可以有他们自己的依赖关系。下面这个Provides函数依赖于一个Thermosiphon对象:
@Provides Pump providePump(Thermosiphon pump) { return pump; }所有的@Provides函数必须属于一个Module。这些Module类使用@Module注释。
@Module
class DripCoffeeModule {
@Provides Heater provideHeater() { return new ElectricHeater(); }
@Provides Pump providePump(Thermosiphon pump) { return pump; }
}
注意,通常情况下, 约定@Provides函数以provide作为前缀, @Module类以Module作为后缀。
构建ObjectGraph(对象图表)
@Inject 和 @Provides 注释的类构建了一个对象图表。这些对象与对象之间通过依赖关系相互关联。通过函数ObjectGraph.create()获取这个对象图表,
这个函数可以接受一个或多个Module作为参数:
ObjectGraph objectGraph = ObjectGraph.create(new DripCoffeeModule());
相关文章推荐
- Android Dagger依赖注入框架浅析
- Dagger,ButterKnife,Roboguide,AndroidAnnotations框架的依赖注入浅析
- Android:dagger2让你爱不释手-基础依赖注入框架篇
- Android神匕首—Dagger2依赖注入框架详解
- Dagger——Android上的依赖注入框架
- Android快速依赖注入框架Dagger2使用2
- Android:dagger2让你爱不释手-依赖注入框架基础篇
- Android:dagger2让你爱不释手-基础依赖注入框架篇
- 关于Android依赖注入框架ButterKnife和Dagger的简单比较
- App开发日报 2015-05-19 Android依赖注入框架Dagger2详解
- Android:dagger2让你爱不释手-基础依赖注入框架篇(语言加配图易懂)
- Android开源框架——依赖注入Dagger
- 关于Android依赖注入框架ButterKnife和Dagger的简单比较
- Android——Dagger2依赖注入框架
- Android Dagger依赖注入框架浅析
- Android:dagger2让你爱不释手-基础依赖注入框架篇
- android依赖注入框架Dagger和Butterknife实战
- Android的依赖注入框架:Dagger
- Android Dagger依赖注入框架浅析
- Android 依赖注入(DI)框架 Dagger