從2015年下半年,國內Android圈子討論Dagger2如火如荼诅挑。Dagger官網(wǎng)第一句這么說:
Dagger is a fully static, compile-time dependency injection framework for both **Java **and Android. It is an adaptation of an earlier version created by Square and now maintained by Google.
前一句意思是:Dagger是一個Java和Android的靜態(tài)、編譯時依賴注入框架。
Dagger是可以在Java上使用的。國內Java Spring久經(jīng)風雨屹立不倒,Square出個Dagger DI框架也就不掃不癢了双吆。
Android同學為何對dagger2
如此熱衷(盡管不一定在項目用到)?在性能上会前,dagger2.x
是編譯時注入好乐,而dagger1.x
是反射,所以2.x
不存在性能問題瓦宜。其次蔚万,Android Studio在2015年已成為Android標配開發(fā)工具(還用eclipse的同學請返回上一頁),gradle構建dagger2
性能临庇、穩(wěn)定性都有了保證反璃。其三,國內兩三年前的Android新手假夺,除了轉行的淮蜈,陸續(xù)步入中級Android工程師之列(正如作者我),不懂dagger2
還好意思在技術圈子混嗎已卷?
新建Maven工程
IntelliJ官網(wǎng)下載:https://www.jetbrains.com/idea/ .
如圖梧田,Create New Project -> Maven -> 填寫GroupId、ArtifactId -> 命名工程、配置工程目錄
Maven引入Dagger2
首先柿扣,去 dagger github官網(wǎng) 瞧瞧:
在"Installation"寫到pom.xml
加上如下代碼:
<dependencies>
<dependency>
<groupId>com.google.dagger</groupId>
<artifactId>dagger</artifactId>
<version>2.2< /version>
</dependency>
<dependency>
<groupId>com.google.dagger</groupId>
<artifactId>dagger-compiler</artifactId>
<version>2.2</version>
<optional>true</optional>
</dependency>
</dependencies>
pom.xml
修改后肖方,會彈出提示框,點擊“Import Changes”未状。之后俯画,Maven就會從遠程maven repository下載依賴的jars,由于國內的網(wǎng)絡有墻司草,這個過程可能要花上好幾分鐘艰垂。
順便一提,如果忘了dagger github官網(wǎng)埋虹,也可以上mvnrepository找到dagger猜憎,有版本選擇搔课,還有maven
胰柑、ivy
、gradle
等構建工具的依賴代碼爬泥,平時android上的gradle引用可以在這里找(推薦這種方式)柬讨。
寫Java代碼
Bean
public class Bean {
public int id;
public String value;
public Bean(int id, String value) {
this.id = id;
this.value = value;
}
@Override
public String toString() {
return "Bean{" +
"id=" + id +
", value='" + value + '\'' +
'}';
}
}
Module
@Module
public class BeanModule {
@Provides
public Bean provideBean() {
return new Bean(1, "bean1");
}
}
Component
@Component(modules = BeanModule.class)
public interface BeanComponent {
void inject(Main main);
}
Bean
、Module
袍啡、Component
三個基本類寫完了踩官,寫注入Bean的Main類:
public class Main {
@Inject
Bean bean;
public Main() {
BeanComponent beanComponent = DaggerBeanComponent.builder()
.beanModule(new BeanModule())
.build();
beanComponent.inject(this);
}
}
DaggerBeanComponent
在Main
構造方法注入Bean
,你寫完發(fā)現(xiàn)DaggerBeanComponent
沒有import
進來境输。
搞毛呀蔗牡,我都沒寫DaggerBeanComponent
,怎么會有這類呢嗅剖?事實上辩越,這個類是dagger2在編譯時生成的。那好信粮,我們Compile
orMake
一下project.....很遺憾黔攒,DaggerBeanComponent
還是沒import
。
這時蒋院,你注意目錄結構下有個target
目錄
我們看一下/target/generated-sources/annotations
:
/target/generated-sources/annotations/com/maven/dagger2/component
居然有一個DaggerBeanComponent.java
,但怎么import
進Main
傲隆欺旧?
我們先瞅一眼MavenDagger2.iml
:
sourceFolder
表示project的源文件,/src/main/java
就是我們平時寫java代碼的目錄蛤签。這時拍一下腦袋辞友,我自己把/target/generated-sources/annotations/
加上去不就行了嗎?我居然這么聰明!
別急称龙,程序猿怎么能手動做這種事情留拾,讓maven幫我完成:
右鍵
pom.xml
->Maven ->Reimport,等上兩三秒
好像沒什么反應耶鲫尊,MavenDagger2.iml
也沒改變痴柔。作者你坑我?
再Make
orCompile
一下工程:
DaggerBeanComponent
成功import
R呦颉?任怠!
再瞧瞧MavenDagger2.iml
:
多了<sourceFolder url="file://$MODULE_DIR$/target/generated-sources/annotations" isTestSource="false" generated="true" />
搔驼。
這時看看工程目錄
/target/generated-sources/annotations
下生成的java文件谈火,就好像是你自己寫的一樣。如果你要研究DaggerComponent
生成代碼與Component
舌涨、Module
之間關系糯耍,看這里比Android好多了
main()方法
在Main
寫上main()
方法:
public static void main(String[]args) {
Main main = new Main();
main.showBean();
}
運行一下main()
:
Bean
依賴注入成功!
思考
Android同學們可能會提個問題:
作為Android程序猿囊嘉,有必要學習在IntelliJ上寫dagger2的代碼嗎温技?
首先得承認,我是裝逼(害羞)哗伯。
Android
程序猿也是java
程序猿荒揣,我自己經(jīng)常在intelliJ
寫demo
,寫完copy過去android工程焊刹。性能上系任,IntelliJ
編譯java
項目遠比Android Studio
快,對于邏輯較復雜的代碼(例如算法)虐块,在IntelliJ
反復修改俩滥、編譯運行的效率是非常高的。這樣節(jié)省了你平時編譯的時間去寫代碼贺奠。
其次霜旧,maven
引入dagger2
比gradle
簡單點。剛開始接觸dagger2
儡率,什么都不懂的同學挂据,在IntelliJ
上寫代碼的學習成本相對低,快上手儿普。
希望本文能幫助Android同學更快速地了解崎逃、研究dagger2技術!
參考資料
《Dependency Injection with Dagger 2》
https://github.com/codepath/android_guides/wiki/Dependency-Injection-with-Dagger-2