“一盘沙拉”带你入门Dagger2(一)之HelloWorld,2024吊打面试官系列

99 阅读6分钟

// 添加其他插件

apply plugin: 'com.neenbedankt.android-apt'//添加apt命令

dependencies {

apt 'com.google.dagger:dagger-compiler:2.0.2' //指定注解处理器

compile 'com.google.dagger:dagger:2.0.2'  //dagger公用api

provided 'org.glassfish:javax.annotation:10.0-b28'  //添加android缺失的部分javax注解

}




> 注意:AndroidStudio升级3.0后,Dagger2引入有所变化,不在支持apt1.8了  

> 配置方法为,直接在dependencies里添加即可(记得在project的build.gradle里指定 ext.dagger2\_version = ‘2.0.2’)  

> 参考[Android Studio升级3.0.0遇到的问题与解决办法]( )



dependencies {

annotationProcessor "com.google.dagger:dagger-compiler:$dagger2_version" //指定注解处理器

implementation "com.google.dagger:dagger:$dagger2_version" //dagger公用api

compileOnly 'org.glassfish:javax.annotation:10.0-b28'  //添加android缺失的部分javax注解

}




#### 2\. 增加一个类SaladModule



> 首先声明:前面写的三个被依赖的类(Pear、Banana、 SaladSauce),不用做任何改动

> 

> 下面要用到两个关键的注解**@Module****@Provides**



/**

  • Module管理所有的依赖

  • 就好比:你要做一个沙拉,需要(依赖)Pear/Banana/SaladSauce

  • 这里就把Pear/Banana/SaladSauce这三个被依赖的类管理起来

  • 方便你在之后获取Pear/Banana/SaladSauce的对象

*/

@Module

public class SaladModule {

@Provides

// 按照格式写就好了,

// 返回值(被依赖的类类型)

// 方法名(provideXxx必须以provide开头,后面随意)

public Pear providePear(){

    return new Pear();//返回这个类的对象

}

@Provides

public Banana provideBanana(){

    return new Banana();

}

@Provides

public SaladSauce provideSaladSauce(){

    return new SaladSauce();

}

}




#### 3\. 增加一个接口SaladComponent



> 下面要用到一个关键的注解**@Component**



@Component(modules = {SaladModule.class})//指明要在那些Module里寻找依赖

public interface SaladComponent {

//注意:下面这三个方法,返回值必须是从上面指定的依赖库SaladModule.class中取得的对象

//注意:而方法名不一致也行,但是方便阅读,建议一致,因为它主要是根据返回值类型来找依赖的

//★注意:下面这三个方法也可以不写,但是如果要写,就按照这个格式来

//但是当Component要被别的Component依赖时,

//这里就必须写这个方法,不写代表不向别的Component暴露此依赖



Pear providePear();



Banana provideBanana();



SaladSauce provideSaladSauce();





//注意:下面的这个方法,表示要将以上的三个依赖注入到某个类中

//这里我们把上面的三个依赖注入到Salad中

//因为我们要做沙拉

void inject(Salad salad);

}




#### 4\. 重写Salad类



> 下面要用到一个关键的注解**@Inject**



public class Salad {

@Inject //表示注入这个依赖

Pear pear;

@Inject

Banana banana;

@Inject

SaladSauce saladSauce;



public Salad() {  

    // DaggerSaladComponent编译时才会产生这个类,

    // 所以编译前这里报错不要着急(或者现在你先build一下)

    SaladComponent saladComponent = DaggerSaladComponent.create();

    saladComponent.inject(this); //将saladComponent所有连接的SaladModule中管理的依赖注入本类中

    makeSalad(pear, banana, saladSauce);

}



private void makeSalad(Pear pear, Banana banana, SaladSauce saladSauce) {

    Log.e("TAG", "我在搅拌制作水果沙拉");

}

}





### 5.测试



08-31 15:53:46.117 24628-24628/com.demo.dagger2demo2 E/TAG: 我是一个梨

08-31 15:53:46.118 24628-24628/com.demo.dagger2demo2 E/TAG: 我是一个香蕉

08-31 15:53:46.118 24628-24628/com.demo.dagger2demo2 E/TAG: 我是沙拉酱

08-31 15:53:46.118 24628-24628/com.demo.dagger2demo2 E/TAG: 我在搅拌制作水果沙拉




1.  增加一个类SaladModule

2.  使用@Component增加一个SaladComponent接口

3.  目标类使用依赖注入  

    a)使用@Inject声明属性变量,表示注入这个依赖  

    b)调用saladComponent的inject,注入依赖

    

    ```

     // DaggerSaladComponent编译时才会产生这个类,

     // 所以编译前这里报错不要着急(或者现在你先build一下)

     SaladComponent saladComponent = DaggerSaladComponent.create();

     saladComponent.inject(this);//将saladComponent所连接的SaladModule中管理的依赖注入本类中

    ```

    



或者调用下面方法,也可以



DaggerSaladComponent.builder()

 .saladModule(new SaladModule())

 .build()

 .inject(this);



### 以上只是最最简单的一个例子,入门再说



### 接下来讲到:



1.  被依赖的类,如果带有参数,怎么办

2.  被依赖的类,如果有多个构造函数,Dagger2怎么区分(依赖迷失)

3.  @Scope

4.  @Singleton



参考文章

----



1.  \[Android常用开源工具(1)-Dagger2入门\]([http://blog.csdn.net/duo2005duo/article/details/50618171]( ) )(总结的相当到位)  

    1.  \[ Android:dagger2让你爱不释手 - 重点概念讲解,融合篇\]([http://www.jianshu.com/p/1d42d2e6f4a5]( ) )(解释概念绝对好文章)

    2.  \[ 解锁Dagger2使用姿势\]([http://blog.csdn.net/u012702547/article/details/]( ) 52200927 )(结合例子,通俗易懂)



 



  



本文转自 [https://blog.csdn.net/Android\_Study\_OK/article/details/52384247]( ),如有侵权,请联系删除。
### 最后

简历首选内推方式,速度快,效率高啊!然后可以在拉钩,boss,脉脉,大街上看看。简历上写道熟悉什么技术就一定要去熟悉它,不然被问到不会很尴尬!做过什么项目,即使项目体量不大,但也一定要熟悉实现原理!不是你负责的部分,也可以看看同事是怎么实现的,换你来做你会怎么做?做过什么,会什么是广度问题,取决于项目内容。但做过什么,达到怎样一个境界,这是深度问题,和个人学习能力和解决问题的态度有关了。大公司看深度,小公司看广度。大公司面试你会的,小公司面试他们用到的你会不会,也就是岗位匹配度。

面试过程一定要有礼貌!即使你觉得面试官不尊重你,经常打断你的讲解,或者你觉得他不如你,问的问题缺乏专业水平,你也一定要尊重他,谁叫现在是他选择你,等你拿到offer后就是你选择他了。

另外,描述问题一定要慢!不要一下子讲一大堆,慢显得你沉稳、自信,而且你还有时间反应思路接下来怎么讲更好。现在开发过多依赖ide,所以会有个弊端,当我们在面试讲解很容易不知道某个方法怎么读,这是一个硬伤......所以一定要对常见的关键性的类名、方法名、关键字读准,有些面试官不耐烦会说“你到底说的是哪个?”这时我们会容易乱了阵脚。正确的发音+沉稳的描述+好听的嗓音决对是一个加分项!

最重要的是心态!心态!心态!重要事情说三遍!面试时间很短,在短时间内对方要摸清你的底子还是比较不现实的,所以,有时也是看眼缘,这还是个看脸的时代。

希望大家都能找到合适自己满意的工作!
**如果需要PDF版本可以在GitHub中自行领取!**

* ##### **[或者点击这里自行下载,直达领取链接](https://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)**

**进阶学习视频**

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/f7f3a1a6999d4384b667d8d84e31a705~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDY4Mzc0MTQxMzQ0:q75.awebp?rk3s=f64ab15b&x-expires=1773701444&x-signature=RHxTr5zle4UAuaR42vVl4Q%2BTIcQ%3D)

**附上:我们之前因为秋招收集的二十套一二线互联网公司Android面试真题** (含BAT、小米、华为、美团、滴滴)和我自己整理Android复习笔记(包含Android基础知识点、Android扩展知识点、Android源码解析、设计模式汇总、Gradle知识点、常见算法题汇总。)

![](https://p9-xtjj-sign.byteimg.com/tos-cn-i-73owjymdk6/c94ae2c9ae664d09a336d2893201f28d~tplv-73owjymdk6-jj-mark-v1:0:0:0:0:5o6Y6YeR5oqA5pyv56S-5Yy6IEAg55So5oi3MDY4Mzc0MTQxMzQ0:q75.awebp?rk3s=f64ab15b&x-expires=1773701444&x-signature=%2FUw8UlnVWK9I6rsuASzExzgN9LA%3D)