實例爲一個簡單的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());
}
}
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());
}
}