• 08、Android进阶--Dagger2原理解析


    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在不同情况下源码都会有区别,这里不再详细描述。

  • 相关阅读:
    discuz对PHP7不支持mysql的兼容性处理
    mysql 5.6 设置root初始密码正确步骤,避免入坑
    当root用户无密码,非超级权限用户时提示mysqladmin: Can't turn off logging; error: 'Access denied; you need the SUPER privilege for this op解决方案
    部署 LAMP (CentOS 7.2),摘自阿里云,方便查看使用
    Win32 API编程:网络编程在设置WSAAsyncSelect模型后connect的返回值问题
    指针、指针变量梳理,取地址与取值运算
    C++/VC中ANSI与UNICODE中字符定义和函数对照表
    com.google.gson的SerializedName解决实体类与关键字的重名
    【Java】BigDecimal
    【MySQL】去重
  • 原文地址:https://www.cnblogs.com/pengjingya/p/15004608.html
Copyright © 2020-2023  润新知