实例为一个简单的Android应用,使用AndroidStudio;创建了一个BookModel,在activity中使用TextView显示该BookModel信息。
未使用Dagger的常规实现如下:
public class TestDaggerMainActivity extends BaseActivity {
TextView mShowInfoView;
BookModel mBook;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_dagger_main);
//
initDatas();
initViews();
showBookinfo();
}
private void initDatas() {
mBook = new BookModel("testBook", 25);
}
private void initViews() {
mShowInfoView = (TextView)findViewById(R.id.showBookInfo_view);
}
private void showBookinfo() {
mShowInfoView.setText(mBook.toString());
}
}
BookModel.java的定义:
public class BookModel {
private String name;
private float price;
public BookModel() {
}
public BookModel(String name, float price) {
this.name = name;
this.price = price;
}
//getter setter省略
@Override
public String toString() {
return "[" + name + "\t" + price + "元]";
}
}
1. 配置build.gradle
1)需要配置apt插件,没有这插件,dagger可能不会正常工作,特别是在Android studio中。
2)需要配置“
javax.annotation”,Dagger2中会用到@Generated注解,而javax.anotation.generated在Android API 中没有。
apply plugin: 'android-apt'
//
buildscript {
repositories {
jcenter()
}
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
//dependencies中的配置
//for dagger2
apt 'com.google.dagger:dagger-compiler:2.0'
compile 'com.google.dagger:dagger:2.0'
// Dagger2中会用到@Generated注解,而javax.anotation.generated在Android API 中是没有.
compile 'org.glassfish:javax.annotation:10.0-b28'
2. 构建依赖
Dagger2中,这个负责提供依赖的组件被称为Module。使用@Module标识类型为module,并用@Provides标识提供依赖的方法。
构建的ActivityModule代码如下所示。
@Module
public class ActivityModule {
@Provides
BookModel provideUserModel() {
return new BookModel("testBook", 25);
}
}
3. 构建Injector
连接提供依赖和消费依赖对象的组件被称为Injector;Dagger2中,我们将其称为Component。
Component是一个使用@Component标识的Javainterface。interface的inject方法需要一个消耗依赖的类型对象作为参数。
注意:这里必须是真正消耗依赖的类型TestDaggerMainActivity(实际的消耗依赖的类),而不可以写成其父类等。
ActivityComponent代码如下,代码编译后,会自动生成实现类“DaggerActivityComponent”,在构建依赖注入时需要用到。
@Component(modules = ActivityModule.class)
public interface ActivityComponent {
void inject(TestDaggerMainActivity activity);
}
4. 完成依赖注入
在TestDaggerMainActivity中构建Injector对象,完成注入。
注:BookModel mBook 不能定义为private。注:BookModel mBook 不能定义为private。
public class TestDaggerMainActivity extends BaseActivity {
private ActivityComponent mActivityComponent;
TextView mShowInfoView;
//
@Inject
BookModel mBook;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_test_dagger_main);
//
initDatas();
initViews();
showBookinfo();
}
private void initDatas() {
//构建Injector对象及完成注入
mActivityCompOnent= DaggerActivityComponent.builder()
.activityModule(new ActivityModule()).build();
mActivityComponent.inject(this);
}
private void initViews() {
mShowInfoView = (TextView)findViewById(R.id.showBookInfo_view);
}
private void showBookinfo() {
mShowInfoView.setText(mBook.toString());
}
}