Android中使用Dagger2进行依赖注入
Dagger2是首个使用生成代码实现完整依赖注入的框架,极大减少了使用者的编码负担,本文主要介绍如何使用Dagger2进行依赖注入。
Dagger2简单介绍
Dagger2,起源于Square的Dagger,是一个完全在编译期间进行的依赖注入框架,完全去除了反射。Dagger2是通过依赖注入让你少写很多公式化代码,更容易测试,降低耦合,创建可复用可互换的模块。
Dagger2实例
Dagger2环境搭建
project的build.gradle添加
1 | dependencies { |
module的build.gradle添加
1 | apply plugin: 'com.neenbedankt.android-apt'//添加apt命令 |
代码实现
Usermodele 是一些基本消息
1 | public class UserModel { |
Module其实就是一个依赖的制造工厂。我们只需要为其添加制造依赖的方法即可。
@Module
public class ActivityModule {
@Provides
public UserModel provideUserModel() {
return new UserModel("1", "hjx", "man");
}
}
注解@Module注明本类属于Module ,注解@Provides注明该方法是用来提供依赖对象的特殊方法 。
一个完整的Module必须拥有@Module与@Provides注解 。
Component就是一个将Module生成的实例注入Container中的注入器
@Component(modules = ActivityModule.class)
public interface ActivityComponent {
void inject(MainActivity mainActivity);
}
@Component使用modules指向使用的Module的集合。 所有的Component都必须以接口形式定义。Dagger2框架将自动生成Component的实现类,对应的类名是Dagger×××××,这个例子中对应的实现类是DaggerActivityComponent,添加注入方法,一般使用inject做为方法名,方法参数为对应的Container。
Container就是可以被注入依赖关系的容器,这里的容器为Activity。具体实现如下
public class MainActivity extends AppCompatActivity {
private ActivityComponent mActivityComponent;
@Inject
UserModel mUserModel; //不能为private
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mActivityComponent = DaggerActivityComponent.builder().
activityModule(new ActivityModule()).build();
mActivityComponent.inject(this);
((TextView) findViewById(R.id.textView)).
setText("ID:" + mUserModel.getId() + " Name: " + mUserModel.getName()
+ " Gender: " + mUserModel.getGender());
}
}
Container中@Inject标记需要被注入的对象,mActivityComponent.inject(this)表示将调用Component的实现类将Module的生成的对象注入到mUserModel中。
到这为止,怎样使用Dagger2进行依赖注入的小demo已经完成了,代码已经上传到Github。
欢迎大家关注我的微信公众号,我会不定期的分享些Android开发的技巧