@Override
public void onCreate() {
super.onCreate();
activityComponent = DaggerMainDaggerActivityComponent.builder()
.swordmanComponent(DaggerSwordmanComponent.builder().build())
.build();
可以看出 DaggerMainDaggerActivityComponent 构造时多了 DaggerSwordmanComponent 的构造过程。
最后在 activity 注入 Swordman 依赖:
public class MainDaggerActivity extends Activity {
@Inject
Gson gson1;
@Inject
Gson gson2;
@Inject
Swordman swordman;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dagger);
SampleApplication.get(this).getActivityComponent().inject(this);
Log.d("dagger2", "swordman:" + swordman.fight());
输出如下:
D/dagger2: swordman:fighting
可以看出依赖的 swordman Component 也注入成功。
懒加载模式即 @Inject 不初始化,使用时才初始化。改写上面的 swordman component 如下:
public class MainDaggerActivity extends Activity {
@Inject
Gson gson1;
@Inject
Gson gson2;
@Inject
Lazy<Swordman> swordman;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_dagger);
SampleApplication.get(this).getActivityComponent().inject(this);
Log.d("dagger2", "lazy swordman:" + swordman.get().fight());
可以看出 @Inject 了 Lazy 对象,使用时需要先 get() 得到真正的 swordman 对象。
输出如下:
D/dagger2: lazy swordman:fighting
Dagger2 通过注解的方式构造实例对象,避免使用者在调用对象的时候一层层构造依赖。因为使用者不需要了解它所依赖的对象的细节,而只需要调用依赖的方法,所以可以通过注解的方式将依赖组件的构造方式交给 Dagger2 的 Component 去处理,避免了大量重复的构建工作。
常用的注解有 @Inject、@Component、@Module、@Provides、@Named、@Qualifier、@Singleton、@Scope 等,也可以使用 Lazy 懒加载的方式在使用时创建对象。
Dagger2 依赖注入框架介绍Dagger2 是一个标准的依赖注入框架。Dagger2 是 Dagger1(Square 公司开发)的分支,由谷歌接手开发。添加依赖这里以 dagger 2.24 版本为例,在 app 的 build.gradle 添加 dagger 依赖如下:// Add Dagger dependenciesdependencies { api 'com.goo...