美文网首页
Dagger2在Android中的实践

Dagger2在Android中的实践

作者: 放羊娃华振 | 来源:发表于2019-12-14 15:22 被阅读0次

    一、概述

    简单的说,就是一个工厂模式,由Dagger负责创建工厂,帮忙生产instance。遵从Java规范JSR 330,可以使用这些注解。现在不研究Dagger2是如何根据注解去生成工厂的,先来看看工厂是什么东西,理解为什么可以实现了DI(Dependency Injection),如何创建IoC(Inverse of Control)容器。

    二、获取实例逻辑

    Dagger2是通过依赖注入完成类的初始化,这个过程需要三部分:
    1.依赖提供方(生产者)
    2.依赖注入容器(桥梁)
    3.依赖需求方(消费者)


    image.png

    三、文档及源码

    google文档:https://dagger.dev/api/latest/
    github地址:https://github.com/google/dagger
    实验源码:https://github.com/stormdzh/DaggerTest

    四、实践

    1.生产方的实现,也就是被调用的类

    /**
     * @Description: AUtil 简单的工具类
     * @Author: dzh
     * @CreateDate: 2019-12-14 14:18
     */
    public class AUtil {
        /**
         * 弹出提示
         *
         * @param context 上下文
         * @param text    文本信息
         */
        public void toast(Context context, String text) {
            Toast.makeText(context, text, Toast.LENGTH_SHORT).show();
        }
    }
    

    2.构建生产方实例对象的Module

    /**
     * @Description: UtilModule
     * @Author: dzh
     * @CreateDate: 2019-12-14 14:17
     */
    @Module  //第一步:添加@Module 注解
    public class UtilModule {
    
        @Provides
            //第二步:使用Provider 注解 实例化对象
        AUtil providerAUtil() {
            return new AUtil();
        }
    }
    

    3.创建一个Component

    /**
     * @Description: UtilComponent
     * @Author: dzh
     * @CreateDate: 2019-12-14 14:21
     */
    @Component(modules = {UtilModule.class})//第一步 添加@Component 和 module
    public interface UtilComponent {
    
        //第二步:写一个方法 绑定Activity /Fragment
        void inject(MainActivity activity);
    }
    

    4.调用方式

    public class MainActivity extends AppCompatActivity {
    
        @Inject
        AUtil aUtil;
    
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_main);
    
            //方式一
            DaggerUtilComponent.create().inject(this);
            //方式二
            //DaggerUtilComponent.builder().build().inject(this);
    
            //在触发了inject之后,就已经帮我们实例化好了AUtil对象
            aUtil.toast(this, "我是有dagger构建对象,在弹出的提示");
        }
    }
    

    五、简单看看实例是如何产生的

    1.从MainActivity入手,可以看看DaggerUtilComponent.create().inject(this)方法的实现。


    image.png
    image.png
    image.png

    相当于是使用MainActivity.providerAUtil()


    image.png
    上面的很多类我们并没有创建但是怎么就有了尼?
    image.png
    其实这些都是利用java的apt生成的文件。

    6、常用注解

    @Inject
    用来注入对象,例如:

    @Module
    注解类,负责管理依赖。

    @Provides
    注解@Module 类中的方法,在modules中,我们定义的方法是用这个注解,以此来告诉Dagger我们想要构造对象并提供这些依赖。

    @Component
    一般用来注解接口,负责在@Inject和@Module之间建立连接。
    也可以说是@Inject和@Module的桥梁,它的主要作用就是连接这两个部分。

    @Scope
    Scopes可是非常的有用,Dagger2可以通过自定义注解限定注解作用域。后面会演示一个例子,这是一个非常强大的特点,因为就如前面说的一样,没 必要让每个对象都去了解如何管理他们的实例。在scope的例子中,我们用自定义的@PerActivity注解一个类,所以这个对象存活时间就和 activity的一样。简单来说就是我们可以定义所有范围的粒度(@PerFragment, @PerUser, 等等)。

    @Qualifier
    当类的类型不足以鉴别一个依赖的时候,我们就可以使用这个注解标示。例如:在Android中,我们会需要不同类型的context,所以我们就可以定义 qualifier注解“@ForApplication”和“@ForActivity”,这样当注入一个context的时候,我们就可以告诉 Dagger我们想要哪种类型的context。

    相关文章

      网友评论

          本文标题:Dagger2在Android中的实践

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