在这篇文章中你会看到什么:html
@Module
是什么@Provides
是什么@Module
、@Provides
和@Component
如何协同做战。既然在Dagger 2 系列(二) -- 基础篇:基本功能的实现一文中经过 @Inject
和 @Component
咱们已经实现了 DI,那么为何 Dagger2
还要实现其余的DI 方式。java
其实在上文中咱们实现的 DI 方式中咱们不难发现,经过@Inject
的注解实体类的构造函数是必不可少,它标识着 Dagger2 能够实例化该类。那么当你须要实例化一个第三方的对象时,是否是懵逼了,由于你不可能注解第三方类的构造函数 -- 好比说 Gson
类的构造函数。那么如今就须要 @Module
来充分发挥做用了。git
其实Module 实际上是一个简单工厂模式,Module 里面的方法都是建立相应类实例的方法。github
具体什么是 简单工厂模式,请看代码段简单学习设计模式 -- 简单工厂模式设计模式
栗子:经过 @Module
的方式得到第三方类库的对象 -- Gson
(固然也能够得到自定义类对象)bash
@Module
public class AModule {
@Provides
public Gson provideGson(){
return new Gson();
}
}
复制代码
你再该类中看到了两个注解:app
@Module
注解类@Provides
注解方法一个 Component
能够含有多个 Module
,这样在寻找依赖实例时就会自动从多个 Module
中寻找。框架
添加 多个 Module
的方法有两种:ide
示例代码以下:函数
@Component(modules={ModuleA.class,ModuleB.class,ModuleC.class})
public interface AppComponent{
...
}
复制代码
示例代码以下:
@Module(includes={ModuleA.class,ModuleB.class,ModuleC.class})
public class FruitModule{
...
}
@Component(modules={FruitModule.class}) //添加多个Module
public interface AppComponent{
...
}
复制代码
这种使用 Module
的 includes
添加多Module
的方法通常用于构建更高层的Module
时候使用,如在本例中
@Provides
用以标注 Module
类中的方法,它的做用是 标注该 Module
能够向外界提供的类的实例对象的方法 ,就像 AModule
中能够提供 Gson
实例对象的 provideGson()
方法。
此时 DI 不是经过 @Inject
注解类构造器的方式,那么这个注解器的使用方法确定也有所变化。此时 Component 的职责是管理 Module,Component 中的属性容许 Module 能够加入到 Component,同时一个 Component 能够加入多个 Module。
依赖注入的具体工做流程:
若实例化过程当中参数一样是须要依赖注入的,那么须要按照上图中的流程同样寻找相应的方法。若是遍历了组件中管理的 Module 类中的 @Provides 注解的方法,那么就会寻找该实例类的构造器中是否有被 @Inject 注解的,若是参数一样有须要依赖注入的,那么就重复以上过程。若是最终仍是没有找到相应的初始化实例的方法,那么程序会报出相应的错误。
@Component(modules = UserTwoModule.class)
public interface UserTwoComponent {
void injectToSecondActivity(SecondActivity mSecondActivity);
}
@Module
public class UserTwoModule {
@Provides
UserTwo provideUserTwo(){
return new UserTwo("男",1243);
}
}
public class SecondActivity extends AppCompatActivity {
@Inject
UserTwo mUserTwo;
private static final String TAG = "SecondActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
DaggerUserTwoComponent.builder().userTwoModule(new UserTwoModule()).build().injectToSecondActivity(this);
}
}
复制代码
到此为止,咱们已经实现了基本的基于Dagger2
的@Module
和@Provides
的依赖注入。下面咱们把过程再梳理一遍:
Module
中建立返回值为相应实体类的方法,并用 @Provides
标注Component
(注入器)的injectXXX
(Object)方法开始注入(injectXXX
方法名字是官方推荐的名字,以inject开始)Component 就像媒介,链接 Module
和 目标类
,把目标类依赖的实例注入到目标类中,来初始化目标类中的依赖。