接上篇文章
4.Dagger2使用方法拓展:
_4.1Dagger2实现单例模式:
在java中,实现单例模式的方法有很多,如:
利用 synchronized锁实现橘子类的单例
public class Orange{
private static Orange instance;
private Orange() {
}
public static Orange getInstance() {
if ( instance == null ) {
synchronized ( Orange.class ) {
if ( instance == null ) {
instance = new Orange();
}
}
}
return instance;
}
}
而在Dagger2中,我们可以这样实现:
(1).首先我们用 @Sington注解标记要获取单例的类
@Singleton
public class Orange
{
@Inject
public Orange() {
Log.d("111", "Orange: 我是橘子");
}
}
然后用 @Sington注解标记我们的需要用到单例依赖的Component类。
@Singleton
@Component(modules = {DaggerModule.class})
public interface MainActivityComponent
{
//为传入的MainActivity对象注入所需的依赖knife,并且为knife注入所需要的的依赖
void inject(MainActivity mainActivity);
}
然后我们在MainActivity中
@Inject
Apple apple1;
@Inject
Apple apple2;
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
log.d("lll",apple1.toString());
log.d("lll",apple2.toString());
}
}
然后我们就会发现输出的对象编号都是一样的。我们顺利地用Dagger2实现了单例模式。
如果你使用的是provider的方式注入的对象,在 @Provider注解上方添加 @Sington注解即可。
_4.2Dagger2实现延迟加载:
有时候我们为了提升软件的加载速度,会让一些非必须的类进行延迟加载,即当用到它的时候再去加载。
在Dagger2中,我们这样实现:
@Inject
Lzay<T> t;
//Lzay是泛型类,只要传入我们需要的类即可
_4.3Dagger2实现强制重新加载:
有时候我们想要每次都获取一个全新的对象的时候,在Dagger2中,我们这样实现:
@Inject
Provider<T> t;
//Provider是泛型类,只要传入我们需要的类即可
_4.4Component:之间的依赖
我们在一个Compontent1中可以提供一个依赖A,在另外一个Compontent2中可以提供依赖B,C。而我们有一个需求就是需要用到ABC三个依赖,我们就可以让Compontent2依赖Compontent1.这样我们的就可以直接使用Compontent2来获取Compontent1中的依赖。
比如我们现在有一个专门提供水果这个依赖
@Component(modules = {DaggerModule.class} ,dependencies = MainActivityComponent.class)
public interface FruitComponent
{
Orange getOrange();
}
光是这样还是不够的,我们需要在用到这个FruitComponent时传入一个MainActivityComponent。
MainActivityComponent mainActivityComponent = MainActivityComponent.builder()
.build()
.inject(this);
DaggerFruitComponent
.builder()
.mainActivityComponent (mainActivityComponent )
.build();
_4.5Provider方法返回相同类型的依赖时的区分方式
在同一个module中,Dagger是靠依赖的类型来选择Provider的。但有时候同一个Module中会有返回两个相同的依赖的两个方法,这时候我们就要用到 @Named注解。@Named使用非常简单,我们在@Inject注解下方加上**@Named注解,然后在Modul中 @Provider注解下方也加入@Named**注解即可,如下:
@Inject
@Named("bnana1")
Bnana bnana1;
@Inject
@Named("bnana2")
Bnana bnana2;
@Module
public class DaggerModule {
@Provides
@Named("bnana1")
public Bnana getBnana()
{
log.d("111,"我是bnana1")
return new Bnana();
}
@Provides
@Named("bnana2")
public Bnana getBnana()
{
log.d("111,"我是bnana2")
return new Bnana();
}
}
到这里,Dagger2的使用方法介绍就结束了,下篇文章我们一起学习一下Dagger2源码。