Dagger2原理
我们先写一个简单的例子,创建User、UserModule 和ActivityComponent,代码如下所示:
public class User {
public String eat(){
return "吃吃吃";
}
}
@Module
public class UserModule {
@Provides
public User provideUser(){
return new User();
}
}
@Component(modules = UserModule.class)
public interface ActivityComponent {
void inject(MainActivity activity);
}
在MainActivity中使用User,如下所示:
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Inject
User user;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerActivityComponent.create().inject(this);
String content = user.eat();
Log.e(TAG, content);
}
}
这时编译程序会在 build 目录中生成辅助类:
DaggerActivityComponent.java
MainActivity_MembersInjector.java
UserModel_ProvideUserFactory.java
首先从DaggerActivityComponent的代码开始分析,如下所示:
public final class DaggerActivityComponent implements ActivityComponent {
private final UserModule userModule;
private DaggerActivityComponent(UserModule userModuleParam) {
this.userModule = userModuleParam;
}
public static Builder builder() {
return new Builder();
}
// 建造者模式
public static ActivityComponent create() {
return new Builder().build();
}
@Override
public void inject(MainActivity activity) {
injectMainActivity(activity);}
private MainActivity injectMainActivity(MainActivity instance) {
MainActivity_MembersInjector.injectUser(instance, UserModule_ProvideUserFactory.provideUser(userModule));
return instance;
}
public static final class Builder {
private UserModule userModule;
private Builder() {
}
public Builder userModule(UserModule userModule) {
this.userModule = Preconditions.checkNotNull(userModule);
return this;
}
// 创建了UserModule
public ActivityComponent build() {
if (userModule == null) {
this.userModule = new UserModule();
}
return new DaggerActivityComponent(userModule);
}
}
}
这里主要就是通过建造者模式创建UserModel,并返回当前对象DaggerActivityComponent对象。其中inject方法调用了MainActivity_MembersInjector的injectUser方法,并将Activity的实例和User对象传入,代码如下所示:
public final class MainActivity_MembersInjector implements MembersInjector<MainActivity> {
private final Provider<User> userProvider;
public MainActivity_MembersInjector(Provider<User> userProvider) {
this.userProvider = userProvider;
}
public static MembersInjector<MainActivity> create(Provider<User> userProvider) {
return new MainActivity_MembersInjector(userProvider);}
@Override
public void injectMembers(MainActivity instance) {
injectUser(instance, userProvider.get());
}
// 标记
public static void injectUser(MainActivity instance, User user) {
instance.user = user;
}
}
可以看到,这里其实就是将user实例赋值给instance也就是Activity的user引用。此时,就完成了注入的操作。
我们回到上面DaggerActivityComponent的代码中,在UserModel_ProvideUserFactory的provideUser方法代码如下:
public final class UserModel_ProvideUserFactory implements Factory<User> {
private final UserModel module;
public UserModel_ProvideUserFactory(UserModel module) {
this.module = module;
}
@Override
public User get() {
return provideUser(module);
}
public static UserModel_ProvideUserFactory create(UserModel module) {
return new UserModel_ProvideUserFactory(module);
}
// 标记
public static User provideUser(UserModel instance) {
return Preconditions.checkNotNull(instance.provideUser(), "Cannot return null from a non-@Nullable @Provides method");
}
}
这里就是简单的判断实例是否为空,为空则提示方法是否添加@Provides注解。
总结:整个过程就是DaggerActivityComponent通过建造者模式创建UserModule,然后在MainActivity_MembersInjector的inject方法中将user赋值给Activity的user引用。其中,user的实例是通过UserModule_ProvideUserFactory的provideUser方法来创建的。
注意:这里只是针对当前代码的情况,Dagger2在不同情况下源码都会有区别,这里不再详细描述。