前言
Dagger2是首个使用生成代码完整依赖注入的框架,极大减少了使用者的编码负担
1、简单的依赖注入
首先我们构建一个简单的android应用。我们创建一个UserModel,然后将他显示到TextView中。这里的问题是,一旦我们的UserModel的创建方式发生了改变,我们就需要修改创建UserModel的代码,而我们希望的是对于UserModel的修改不影响其他模块的代码(比如这里的MainActivity)
publicclassMainActivityextendsActionBarActivity{
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
UserModeluser =newUserModel();
((TextView) findViewById(R.id.user_desc_line)).setText(user.id +"\n"+ user.name +"\n"+ user.gender);
}
...
}
1.1构建依赖
我们搜先想到的是,将创建UserModel的代码独立出来,这样可以保证MainActivity的代码不被修改。dagger2中,这个负责提供以来的组件被称为Module(模块)。我们构建的ActivtyModule代码如下所示:
@Module
publicclassActivityModule{
@ProvidesUserModelprovideUserModel(){
returnnewUserModel();
}
}
可以看到,我们使用@Module标识类型为module,并用@Provides标识提供依赖的方法。
1.2 构建Injector(注射器)
有了提供依赖的组件,我们海域要将依赖注入到需要的对象中。该提供依赖对象的组件被成为injector。dagger2中,我们将其成为compoent(成分)。ActivityComponent代码如下:
@Component(modules = ActivityModule.class)
publicinterfaceActivityComponent{
voidinject(MainActivity activity);
}
可以看到,Component是一个使用@Component 标识的interace(接口)。interface的inject方法需要一个消费的类型对象作为参数。(消费的类型不可以携程其父类)
1.3 完成依赖注入
最后,我们需要在MainActivity中的构建Injector对象,完成注入。这部分代码如下:
publicclassMainActivityextendsActionBarActivity{
privateActivityComponentmActivityComponent;
@InjectUserModeluserModel;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mActivityComponent =DaggerActivityComponent.builder().activityModule(newActivityModule()).build();
mActivityComponent.inject(this);
((TextView) findViewById(R.id.user_desc_line)).setText(userModel.id +"\n"+ userModel.name +"\n"+ userModel.gender);
}
...
}
首先,我们使用@Inject标记被注入的对象userModel(注意userModule不能为private),之后通过dagger2生成的实现了我们提供的ActivityComponent创建component,调用其inject方法完成注入。至此,我们使用dagger实现了简单的依赖注入。