——个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主与书籍精华
参考见:Android开发之Dagger2--Module&Component(三)
【个人理解:Module类可提供返回多个实例来绑定到Component包装类,然后包装类Component再在要使用的类或者位置中进行注入实例,最后就可以使用了】
可以把这个框架就把它想成了一个注射器,component是针管,module是注射瓶,里面的依赖对象是注入的药水,build方法是插进患者,inject方法的调用是推动活塞。
1.@Module:用来修饰类,表示此类的方法是用来提供依赖的,它告诉Dagger在哪里可以找到依赖,在这个类里实例化要用到的对象,比如全局要用到的SharedPreferences、Retrofit。
2.@Provides:在@Module 中使用,我们定义的方法用这个注解,用于告诉 Dagger 我们需要构造实例并提供实例返回。
3.@Singleton 单例,类似单例模式,单例是基于Component的,使用@Singleton注解之后,在同一个Component中对象只会被初始化一次,之后的每次都会被直接注入相同的对象。@Singleton就是一个内置的作用域,即局部单例。在不同的Component中注入是不构成单例的。
4.@Component: 是@Inject注入和@Module组件的桥梁,需要列出所有被@Module注解修饰的Module类组件以组成一个完整的组件,Component是一个包装类,用于从@Module中获取依赖并将依赖注入给@Inject
@Singleton
@Component(modules = {
StorageModule.class ,
ScheduleModule.class
})
public interface StorageComponent {
Storage execute();
void inject(MainActivity mMainActivity);
}
---------------------
参考原文:https://blog.csdn.net/qq_17766199/article/details/50606011
Dagger会按照上面接口生成一个实现类,生成类以Dagger为前缀即DaggerStorageComponent,其中DaggerStorageComponent是StorageComponent的一个实体类,提供builder()来生成实例,里面使用Builder构建了一个。
要注入一个类,可以通过两种方法:
- 在提供实例的类的构造方法上添加@Inject注解。默认情况下,Dagger满足依赖关系是通过调用构造方法得到实例的,但是@Inject注解方式比@Providers注解等级要低。
- 在Module类方法上使用@Module注解类,@Providers注解方法提供实例注入工厂的方式
public class MainActivity extends AppCompatActivity{
private StorageComponent component;
@Inject
Storage mStorage;//构建dagger的DaggerStorageComponent后就可以注入了
@Override
public void onCreate() {
super.onCreate();
component = DaggerStorageComponent//自动生成的Dagger前缀类
.builder()//调用构建类
.storageModule(new StorageModule(this)) //传入Module,storageModule为构造方法
.build();//生成实例
.inject(this);//注入MainActivity.
}
}
---------------------
原文:https://blog.csdn.net/qq_17766199/article/details/50606011
5.@Scope。在Dagger 2中,@Scope被用于标记自定义的scope注解,可以理解为生命周期。简单说它们可以类似单例地标记依赖。被作注解的依赖会变成单例,但是这会与component的生命周期(不是整个应用)关联。在不同的Component中注入是不构成单例的。
6.多个Component依赖。@Subcomponent是复用组件,我们想复用组件时,可以使用它,下面是父组件使用方法。另一种是注解属性添加dependencies。
--->子类:给UserComponent添加UserModule依赖
@Subcomponent(modules = {
UserModule.class
})
public interface UserComponent {
void inject(SecondActivity mSecondActivity);
}
--->父类
@Singleton
@Component( modules ={ AppModule.class})
public interface AppComponent {
Context getAppContext();
//复用UserComponent
UserComponent createUserComponent(UserModule userModule);
}
Android:dagger2让你爱不释手-基础依赖注入框架篇
Dagger2使用AndroidInjector便捷注入
Dagger2使用攻略
Android Dagger2 MVP架构 一看就明白
Dagger2入门
深入浅出Dagger2 : 从入门到爱不释手
网友评论