A fast dependency injector for Android and Java.
Dagger 2 - User's Guide
GitHub - Dagger 2
公共技術(shù)點(diǎn)之依賴注入
Dagger 源碼解析
git clone https://github.com/google/dagger.git
cd dagger
//構(gòu)建項(xiàng)目,需要指定Android sdk目錄
mvn package -Dandroid.sdk.path=/Users/shenyunlong/Library/Android/sdk/
// 運(yùn)行coffee example demo
// 運(yùn)行時(shí)依賴javax.inject-1.jar和dagger-2.5-SNAPSHOT.jar
java -cp examples/simple/target/simple-2.5-SNAPSHOT.jar:examples/simple/target/javax.inject-1.jar:core/target/dagger-2.5-SNAPSHOT.jar coffee.CoffeeApp
關(guān)于Maven
Maven 是一個(gè)項(xiàng)目管理和構(gòu)建自動(dòng)化工具。
一個(gè) maven 項(xiàng)目在默認(rèn)情況下會(huì)產(chǎn)生 JAR 文件,另外 傅瞻,編譯后 的 classes 會(huì)放在 ${basedir}/target/classes 下面呢撞, JAR 文件會(huì)放在 ${basedir}/target 下面灶搜。
// Mac上通過(guò)brew安裝maven
brew install maven
// 檢查是否安裝成功
mvn -v
...
// 構(gòu)建maven項(xiàng)目
mvn package
// 運(yùn)行
java -cp target/helloworld-1.0-SNAPSHOT.jar com.mycompany.helloworld.App
當(dāng)你第一次運(yùn)行 maven 的時(shí)候硫麻,它會(huì)從網(wǎng)上的 maven 庫(kù) (repository) 下載需要的程序,存放在你電腦的本地庫(kù) (local repository) 中咏花,所以這個(gè)時(shí)候你需要有 Internet 連接。Maven 默認(rèn)的本地庫(kù)是 ~/.m2/repository/ 阀趴,在 Windows 下是 %USER_HOME%.m2\repository\ 昏翰。
-
POM (Project Object Model)
一個(gè)項(xiàng)目所有的配置都放置在 POM 文件中:定義項(xiàng)目的類型、名字刘急,管理依賴關(guān)系棚菊,定制插件的行為等等。
在 POM 中叔汁,groupId
,artifactId
,packaging
,version
叫作 maven 坐標(biāo)窍株,它能唯一的確定一個(gè)項(xiàng)目。有了 maven 坐標(biāo)攻柠,我們就可以用它來(lái)指定我們的項(xiàng)目所依賴的其他項(xiàng)目球订,插件,或者父項(xiàng)目瑰钮。一般 maven 坐標(biāo)寫成如下的格式:
groupId:artifactId:packaging:version
像我們的例子就會(huì)寫成:
com.mycompany.helloworld: helloworld: jar: 1.0-SNAPSHOT
Maven 插件
pluginId:goalId
mvn 本身不會(huì)做太多的事情冒滩,它不知道怎么樣編譯或者怎么樣打包。它把構(gòu)建的任務(wù)交給插件去做浪谴。插件定義了常用的構(gòu)建邏輯开睡,能夠被重復(fù)利用。Maven 生命周期
mvn package
這里的 package 是一個(gè)maven的生命周期階段 (lifecycle phase )苟耻。生命周期指項(xiàng)目的構(gòu)建過(guò)程篇恒,它包含了一系列的有序的階段 (phase),而一個(gè)階段就是構(gòu)建過(guò)程中的一個(gè)步驟凶杖。
maven 能支持不同的生命周期胁艰,但是最常用的是默認(rèn)的Maven生命周期 (default Maven lifecycle )。如果你沒(méi)有對(duì)它進(jìn)行任何的插件配置或者定制的話,那么上面的命令 mvn package 會(huì)依次執(zhí)行默認(rèn)生命周期中直到包括 package 階段前的所有階段的插件目標(biāo):
process-resources 階段:resources:resources
compile 階段:compiler:compile
process-classes 階段:(默認(rèn)無(wú)目標(biāo))
process-test-resources 階段:resources:testResources
test-compile 階段:compiler:testCompile
test 階段:surefire:test
prepare-package 階段:(默認(rèn)無(wú)目標(biāo))
package 階段:jar:jar
Maven 依賴管理
在 POM 的 dependencies 部分中腾么,scope 決定了依賴關(guān)系的適用范圍奈梳。我們的例子中 junit 的 scope 是test
,那么它只會(huì)在執(zhí)行 compiler:testCompile and surefire:test 目標(biāo)的時(shí)候才會(huì)被加到 classpath 中解虱,在執(zhí)行 compiler:compile 目標(biāo)時(shí)是拿不到 junit 的攘须。
我們還可以指定 scope 為provided
,意思是 JDK 或者容器會(huì)提供所需的jar文件殴泰。比如說(shuō)在做web應(yīng)用開發(fā)的時(shí)候于宙,我們?cè)诰幾g的時(shí)候需要 servlet API jar 文件,但是在打包的時(shí)候不需要把這個(gè) jar 文件打在 WAR 中悍汛,因?yàn)閟ervlet容器或者應(yīng)用服務(wù)器會(huì)提供的限煞。
scope 的默認(rèn)值是compile
,即任何時(shí)候都會(huì)被包含在 classpath 中员凝,在打包的時(shí)候也會(huì)被包括進(jìn)去署驻。Maven庫(kù)
當(dāng)?shù)谝淮芜\(yùn)行 maven 命令的時(shí)候,你需要 Internet 連接健霹,因?yàn)樗獜木W(wǎng)上下載一些文件旺上。那么它從哪里下載呢?它是從 maven 默認(rèn)的遠(yuǎn)程庫(kù)(http://repo1.maven.org/maven2) 下載的糖埋。這個(gè)遠(yuǎn)程庫(kù)有 maven 的核心插件和可供下載的 jar 文件宣吱。
本地庫(kù)是指 maven 下載了插件或者 jar 文件后存放在本地機(jī)器上的拷貝。在 Linux 上瞳别,它的位置在~/.m2/repository
征候,在 Windows XP 上,在C:\Documents and Settings\username\.m2\repository
祟敛,在 Windows 7 上疤坝,在C:\Users\username\.m2\repository
。當(dāng) maven 查找需要的 jar 文件時(shí)馆铁,它會(huì)先在本地庫(kù)中尋找跑揉,只有在找不到的情況下,才會(huì)去遠(yuǎn)程庫(kù)中找埠巨。
運(yùn)行下面的命令能把我們的 helloworld 項(xiàng)目安裝到本地庫(kù):
mvn install