美文网首页
笔记(二十二)——Dagger2使用

笔记(二十二)——Dagger2使用

作者: 木溪bo | 来源:发表于2019-08-24 11:53 被阅读0次

    ——个人平时笔记,看到的同学欢迎指正错误,文中多处摘录于各大博主与书籍精华
    参考见:Android开发之Dagger2--Module&Component(三)
    【个人理解:Module类可提供返回多个实例来绑定到Component包装类,然后包装类Component再在要使用的类或者位置中进行注入实例,最后就可以使用了】
    可以把这个框架就把它想成了一个注射器,component是针管,module是注射瓶,里面的依赖对象是注入的药水,build方法是插进患者,inject方法的调用是推动活塞。
    1.@Module:用来修饰类,表示此类的方法是用来提供依赖的,它告诉Dagger在哪里可以找到依赖,在这个类里实例化要用到的对象,比如全局要用到的SharedPreferences、Retrofit。
    2.@Provides:在@Module 中使用,我们定义的方法用这个注解,用于告诉 Dagger 我们需要构造实例并提供实例返回。
    3.@Singleton 单例,类似单例模式,单例是基于Component的,使用@Singleton注解之后,在同一个Component中对象只会被初始化一次,之后的每次都会被直接注入相同的对象。@Singleton就是一个内置的作用域,即局部单例。在不同的Component中注入是不构成单例的。
    4.@Component: 是@Inject注入和@Module组件的桥梁,需要列出所有被@Module注解修饰的Module类组件以组成一个完整的组件,Component是一个包装类,用于从@Module中获取依赖并将依赖注入给@Inject

    @Singleton
    @Component(modules = {
            StorageModule.class ,
            ScheduleModule.class
    })
    public interface StorageComponent {
    
        Storage execute();
        void inject(MainActivity mMainActivity);
    }
    --------------------- 
    参考原文:https://blog.csdn.net/qq_17766199/article/details/50606011 
    

    Dagger会按照上面接口生成一个实现类,生成类以Dagger为前缀即DaggerStorageComponent,其中DaggerStorageComponent是StorageComponent的一个实体类,提供builder()来生成实例,里面使用Builder构建了一个。

    要注入一个类,可以通过两种方法:

      1. 在提供实例的类的构造方法上添加@Inject注解。默认情况下,Dagger满足依赖关系是通过调用构造方法得到实例的,但是@Inject注解方式比@Providers注解等级要低。
      1. 在Module类方法上使用@Module注解类,@Providers注解方法提供实例注入工厂的方式
    public class MainActivity extends AppCompatActivity{
    
        private StorageComponent component;
    
        @Inject
        Storage mStorage;//构建dagger的DaggerStorageComponent后就可以注入了
    
        @Override
        public void onCreate() {
            super.onCreate();
    
            component = DaggerStorageComponent//自动生成的Dagger前缀类
                    .builder()//调用构建类
                    .storageModule(new StorageModule(this)) //传入Module,storageModule为构造方法
                    .build();//生成实例
                    .inject(this);//注入MainActivity.
        }
    }
    ---------------------  
    原文:https://blog.csdn.net/qq_17766199/article/details/50606011 
    

    5.@Scope。在Dagger 2中,@Scope被用于标记自定义的scope注解,可以理解为生命周期。简单说它们可以类似单例地标记依赖。被作注解的依赖会变成单例,但是这会与component的生命周期(不是整个应用)关联。在不同的Component中注入是不构成单例的。
    6.多个Component依赖。@Subcomponent是复用组件,我们想复用组件时,可以使用它,下面是父组件使用方法。另一种是注解属性添加dependencies。

    --->子类:给UserComponent添加UserModule依赖
    @Subcomponent(modules = {
            UserModule.class
    })
    public interface UserComponent {
        void inject(SecondActivity mSecondActivity);
    }
    
    --->父类
    @Singleton
    @Component( modules ={ AppModule.class})
    public interface AppComponent {
        Context getAppContext();
         //复用UserComponent 
        UserComponent createUserComponent(UserModule userModule);
    }
    
    

    Android:dagger2让你爱不释手-基础依赖注入框架篇
    Dagger2使用AndroidInjector便捷注入
    Dagger2使用攻略
    Android Dagger2 MVP架构 一看就明白
    Dagger2入门
    深入浅出Dagger2 : 从入门到爱不释手

    相关文章

      网友评论

          本文标题:笔记(二十二)——Dagger2使用

          本文链接:https://www.haomeiwen.com/subject/iecpvqtx.html