1. 在 gradle 中添加依賴
在主項目的 build.gradle 中添加 Dagger2 庫的依賴
dependencies {
compile 'com.google.dagger:dagger:2.16'
annotationProcessor 'com.google.dagger:dagger-compiler:2.16'
}
2. Dagger2 最簡單用法, 手工賦值
Demo 中只有兩個簡單的類 SimpleActivity 和 UserServer, SimpleActivity 有個 UserServer 類型的 server 變量, 通過添加 @Inject 注解為其賦值:
public class SimpleActivity extends AppCompatActivity {
@Inject
UserServer server;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
public class UserServer {
@Inject
public UserServer() {
}
}
Android Studio 編譯后 Dagger2 庫在 DaggerTest/app/build/generated/source/apt/debug 路徑下生成了兩個輔助類
import dagger.MembersInjector;
import javax.inject.Provider;
public final class SimpleActivity_MembersInjector implements MembersInjector<SimpleActivity> {
private final Provider<UserServer> serverProvider;
public SimpleActivity_MembersInjector(Provider<UserServer> serverProvider) {
this.serverProvider = serverProvider;
}
public static MembersInjector<SimpleActivity> create(Provider<UserServer> serverProvider) {
return new SimpleActivity_MembersInjector(serverProvider);
}
@Override
public void injectMembers(SimpleActivity instance) {
injectServer(instance, serverProvider.get());
}
public static void injectServer(SimpleActivity instance, UserServer server) {
instance.server = server;
}
}
import dagger.internal.Factory;
public final class UserServer_Factory implements Factory<UserServer> {
private static final UserServer_Factory INSTANCE = new UserServer_Factory();
@Override
public UserServer get() {
return provideInstance();
}
public static UserServer provideInstance() {
return new UserServer();
}
public static UserServer_Factory create() {
return INSTANCE;
}
public static UserServer newUserServer() {
return new UserServer();
}
}
SimpleActivity_MembersInjector 類中的 injectMembers 方法實現(xiàn)了為 server 變量賦值. UserServer_Factory 類正如其名, 是 UserServer 的一個工廠類, 它實現(xiàn)了 Factory 接口, 查看源碼發(fā)現(xiàn) Factory 接口是一個空接口, 它繼承了 Provider 接口:
public interface Factory<T> extends Provider<T> {
}
public interface Provider<T> {
T get();
}
然后在 SimpleActivity 類中就可以調(diào)用自動生成的兩個類去給 UserServer 變量賦值:
public class SimpleActivity extends AppCompatActivity {
@Inject
UserServer server;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Provider<UserServer> serverProvider = UserServer_Factory.create();
SimpleActivity_MembersInjector.create(serverProvider).injectMembers(this);
}
}
由于寫的 UserServer 類很簡單, 只有一個無參的構(gòu)造方法, 所以自動生成的 UserServer_Factory 類也很簡單, 給 UserServer 類賦值也很簡單.
下面還有更簡單的方法.
3. 引入 @Component 注解
我們再定義一個接口, 接口實現(xiàn)很簡單, 重點是在類定義上的@Component注解
import dagger.Component;
@Component
public interface SimpleActivityComponent {
void inject(SimpleActivity activity);
}
編譯后依然在 DaggerTest/app/build/generated/source/apt/debug 目錄下會再生成一個輔助類:
public final class DaggerSimpleActivityComponent implements SimpleActivityComponent {
private DaggerSimpleActivityComponent(Builder builder) {}
public static Builder builder() {
return new Builder();
}
public static SimpleActivityComponent create() {
return new Builder().build();
}
@Override
public void inject(SimpleActivity activity) {
injectSimpleActivity(activity);
}
private SimpleActivity injectSimpleActivity(SimpleActivity instance) {
SimpleActivity_MembersInjector.injectServer(instance, new UserServer());
return instance;
}
public static final class Builder {
private Builder() {}
public SimpleActivityComponent build() {
return new DaggerSimpleActivityComponent(this);
}
}
}
DaggerSimpleActivityComponent 的 injectSimpleActivity 方法調(diào)用了 SimpleActivity_MembersInjector 類的 injectServer 方法, 直接 new 了一個 UserServer 對象, 沒有用到前面提到的 UserServer_Factory 類.
這時在 SimpleActivity 類中再給 UserServer 變量賦值就可以改成如下:
public class SimpleActivity extends AppCompatActivity {
@Inject
UserServer server;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 手工注入
Provider<UserServer> serverProvider = UserServer_Factory.create();
SimpleActivity_MembersInjector.create(serverProvider).injectMembers(this);
// 通過 @Component 注解生成 DaggerSimpleActivityComponent 類來注入
DaggerSimpleActivityComponent.create().inject(this);
}
}
如果 SimpleActivity 中有多個變量需要注入, 通過這種方法也只需要一行, 不用和各個需要注入的類打交道.