模式 先说说 MVP Dagger dagger2 mvp android dagger2 mvp dagger mvp mvpdagger2retrofit dagger2 mvp rxjava dagger2 mvp通用架构 dagger2 mvp 封装 todo mvp dagger mvp retrofit dagger2
原文地址:
2253315-089dfdaf61ae002f.png
若何利用
添加依靠
看完上面的代码对比,比拟你已经对 Dagger 发生了强烈的爱好了吧。如斯优雅、高效的体例怎么会不吸惹人呢,下面我们来看看若何在项目中利用 Dagger 。
可以看到,下面输出了“蒸馏器”,这申明我们对这一实例的注入成功了。
看了上面的例子,你是不是感觉有点意思了?可是要留意的是,上面的那种方式合用于无参的组织方式(当然也可以有参数,可是对应的参数的组织方式上也要有 @Inject 注解)。Talk is cheap,show me the code!
public class Distiller {
private Heater mHeater;
@Inject
public Distiller(Heater heater) {
mHeater = heater;
}
@Override
public String toString() {
return "蒸馏器";
}
}
public class Heater {
public Heater() {
}
@Override
public String toString() {
return "加热器";
}
}
留意上面的代码,Heater 类的组织方式没有利用 @Inject 注解,我们运行一下看看结果。
法式抛犯错误,错误的内容是:在没有利用 @Inject 注解组织方式或者 @Provides 注解一个方式时无法供给 Heater 的实例。我们只需要在 Heater 类的组织方式上也加上 @Inject 注解就可以了。
可是假如我们的参数是第三方的类呢?好比参数是一个 String 呢?我们不成能去 String 类的组织方式中添加注解。这时辰就需要用到 Moudle 类了。
我们的 Grape 葡萄类的组织方式有一个 String 参数,经由过程 @Provides 注解,我们可以奉告 Dagger 当需要用到 Grape 类的实例的时辰,来 Module 类中获取。再次运行代码查看成果:
可以看到我们输出了准确的成果:我们来梳理一下 Dagger 注入实例的过程:
本文示例代码:
2253315-531fd836ed0cf9a8.png
bound multiple times
可以看到,编译器报错,提醒 bound multiple times(多次绑定),莫非说 Dagger 只能注入一种实例么??那他的局限性也太big了吧?这时辰 @Named 注解就需要袍笏登场啦~
@Provides
@Named("CabernetSauvignon")
public Grape provideOtherGrape() {
return new Grape("赤霞珠");
}
2253315-c37fc32373d92062.png
默认的注入实例
2253315-88ae0766bdd55f85.png
利用别号的注入实例
可以看到我们此刻可以经由过程 @Named 注解来勾当分歧的葡萄了,那需要利用 Wine 类假如但愿利用赤霞珠作为参数应该怎么办呢,如下所示:
我们新增添一个供给赤霞珠原浆的方式,在其参数中利用了@Named("CabernetSauvignon")来指定,这个参数是赤霞珠。完整的代码如下所示:
此刻我们就可以品尝到利用赤霞珠葡萄建造的白兰地啦~
总结要点:
我们将 Distiller 的 toString() 方式进行点窜:
再次运行法式:
发现问题了吗?我们的白兰地居然利用了分歧的蒸馏器,这很不合理,我们的酿酒作坊只需要一个蒸馏器就可以了,完全不需要对每瓶酒都利用一个新的蒸馏器。也就是说我们的 Distiller 类应该是一个单例!
@Singleton
public class Distiller {
private Heater mHeater;
@Inject
public Distiller(Heater heater) {
mHeater = heater;
}
@Override
public String toString() {
return "有"+mHeater.toString()+"的蒸馏器"+super.toString();
}
}
@Component(modules = BrandyModule.class)
@Singleton
public interface BrandyComponent {
void inject(MainActivity mainActivity);
void inject(TestDagger testDagger);
}
2253315-9dbb09da121f39a3.png
此刻利用的是不异的蒸馏器了
你可能会赞叹:我的天呐!真是魔法!!!我们居然经由过程一个注解就实现了单例模式!?还学什么7种单例模式的实现体例
public class OtherTest {
@Inject
Brandy mBrandy;
@Inject
@Named("CabernetSauvignon")
Brandy mCSBrandy;
public OtherTest() {
DaggerBrandyComponent.create().inject(this);
}
@Override
public String toString() {
return mBrandy.toString()+"\n"+mCSBrandy.toString();
}
}
在我们的测试用例中输出System.out.println(new OtherTest().toString());,成果如下所示:
可以看到我们又生成了一个新的蒸馏器,也就是说我们的 Distiller 类并不是一个真正的单例,可是在一个用例(一个被注入类)的规模内,他确实是一个“单例”。这也就是我所说的,@Scope 注释的障眼法(@Singleton 的本色就是一个 @Scope)。
@Scope 字面意思是规模,现实利用的结果我们可以看出在不异规模内,只会存在一个该实例。那么这个规模到底是什么?我的理解是:挪用注入者的生命周期,就是这个标注的规模。好比 TestDagger 类挪用了 DaggerBrandyComponent.create().inject(this); 进行了注入,在这个类的生命周期里,会复用 Distiller 类的实例。
@Scope
@Retention(RetentionPolicy.RUNTIME)
public @interface Lalala {}
运行的成果与上面是完全不异的!充实证实了 @Scope 注解的素质就是在同生命周期中复用有注解的实例。
注:供给实例的方式、或者含有@Inject的类,其 Scope 名称必需与对应的 Component 完全一致!
起首我们在介绍一个 @Component 注解的参数 dependencies (依靠),经由过程依靠我们可以将打针器进行“继续”,Show me the code!
@Component
@Singleton
public interface BaseComponent {
Distiller anyName();
}
点窜 BrandyComponent 类如下:
留意这里我利用的是方才自行建立的 Scope 注解,因为 Component 的 Scope 不克不及不异。从头编译代码后会发现报错了,是因为我们本来利用的注入是DaggerBrandyComponent.create().inject(this);,当我们为 BrandyComponent 添加依靠后,就不克不及再利用 create 方式来生成 Component 的实例了,只能利用 builder 方式来构建,并且我们还必需要为 builder 添加 baseComponent(BaseComponent baseComponent) 这一方式;
为了验证我们的说法:我们建立一个单例:
将本来的注入方式DaggerBrandyComponent.create().inject(this);点窜为
再次运行代码:
此次我们就真正实现了被注入对象单例了!
public class MyApp extends Application {
private BaseComponent mBaseComponent;
@Override
public void onCreate() {
super.onCreate();
mBaseComponent = DaggerBaseComponent.create();
}
public BaseComponent getBaseComponent() {
return mBaseComponent;
}
}
假如 BaseComponent 需要利用 Module 的话,就将 BaseComponent 实例获取体例点窜为: mBaseComponent = DaggerBaseComponent.builder().baseModule(new BaseModule()).build();
好啦,本篇文章到此也就告一段落了,对于 Dagger 的利用,比拟你也已经有了必然的领会了,本文示例代码在DaggerDemo,大师可以参考着代码阅读本文,会对理解有更好的帮忙!
|