最简单易懂的dagger2示例

本文通过一个简洁的Java示例介绍了Dagger2依赖注入框架的基本用法,帮助初学者快速理解并实现依赖注入,同时提供了GitHub上的完整代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在网上搜了很多资料,包括官网,都看不懂,基本打算放弃了。何况从功能上看,用inject替代new,似乎提升不大。

最后时刻这篇博文拯救了我: https://zhuanlan.zhihu.com/p/24454466 。此文完全抛开了其他博文涉及的Android+MVP等复杂构架,是最简的纯java案例,我一下子就看懂了,可能就10分钟吧,我就实现了0->1的转化。其他博文也写得很用心,但写得都是1->9,故我怎么也看不懂。

拯救我的这篇文章共有4个案例,其中最重要的是第三个,看懂即够。有个微小的遗憾是,作者没有提供可执行的代码,于是我整理成了最简Android版,其中的第三个放在github上: https://github.com/maxyou/Dagger2Demo3。第一个和第二个案例的代码也打包放在里面。这里展示一下第三个的可运行代码,请反复查看相关类、变量的相互关联,于是你就知道是怎么回事了:
    public class Car {
    
        @MarkCarModule.QualifierA
        @Inject Engine engineA;
        @MarkCarModule.QualifierB
        @Inject Engine engineB;
        
        public Car() {
            DaggerCarComponent.builder().markCarModule(new MarkCarModule())
                  .build().inject(this);
        }
        public Engine getEngineA() {
            return this.engineA;
        }
        public Engine getEngineB() {
            return this.engineB;
        }
    }
    
    @Component(modules = {MarkCarModule.class})
    public interface CarComponent {
        void inject(Car car);
    }

    public class Engine {
        String engine_run;
        public Engine(){}
        public Engine(String s){engine_run = s;}
        public String run(){return engine_run;}
    }

    @Module
    public class MarkCarModule {
    
        @Qualifier
        @Retention(RetentionPolicy.RUNTIME)
        public static @interface QualifierA { }
        @Qualifier
        @Retention(RetentionPolicy.RUNTIME)
        public static @interface QualifierB { }
    
        public MarkCarModule(){ }
        @QualifierA
        @Provides
        Engine provideEngineA(){
            return new Engine("gearA");
        }
        @QualifierB
        @Provides
        Engine provideEngineB(){
            return new Engine("gearB");
        }
    }

看各处关联的一个方法是,尝试修改其中的方法名等,看看IDE会给你怎样的提示,你就明白其中的关联了。

值得提示的是其中的一个类DaggerCarComponent并非用户定义,而是dagger2模块帮忙生成的中间数据,大概要rebuild之后才不报错

其中的@Qualifier可以使用更简单@Named替代,具体用法直接看如下示例即可:
@Provides @Named("cached")
@Singleton
OkHttpClient provideOkHttpClient(Cache cache) {
    OkHttpClient client = new OkHttpClient();
    client.setCache(cache);
    return client;
}

@Provides @Named("non_cached")
@Singleton
OkHttpClient provideOkHttpClient() {
    OkHttpClient client = new OkHttpClient();
    return client;
}

@Inject @Named("cached") OkHttpClient client;
@Inject @Named("non_cached") OkHttpClient client2;

以上,基本应用已经足够。如果要继续深研,可以学习@Scope和@Singleton这样的注解

感谢:
1. https://zhuanlan.zhihu.com/p/24454466  神兵利器Dagger2
纯java,帮忙通过最为关键的0->1
2. http://www.jianshu.com/p/39d1df6c877d  Dagger2从入门到放弃再到恍然大悟
此文不厌其烦地讲解了dagger2在Android的MVP模式下的应用,还详细分析了注入过程

此外还阅读了好几篇其他博文,这种从多处学习,再自己整理并分享的感觉真好。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值