zoukankan      html  css  js  c++  java
  • 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在不同情况下源码都会有区别,这里不再详细描述。

  • 相关阅读:
    Linux OpenSSH后门的加入与防范
    Oracle APEX 4.2安装和配置
    springboot 配置jsp支持
    java 多线程 yield方法的意义
    java多线程状态转换
    Jquery_artDialog对话框弹出
    ThinkPHP框架学习摘要
    js弹窗对象不能通过全局对象移到外部函数中执行
    关于rawurldecode PHP自动解码
    td高度不随内容变化display:block;display:block;display:block;display:block;display:block;
  • 原文地址:https://www.cnblogs.com/pengjingya/p/15004608.html
Copyright © 2011-2022 走看看