目錄:
1、依賴注入
2痒钝、Dagger
3婉支、ButterKnife
4鸯隅、Dagger與ButterKnife對(duì)比
1. 依賴注入
1.1. 概念
依賴注入是一種<a>“設(shè)計(jì)模式”</a>。最早出現(xiàn)在Spring中向挖。
依賴注入:【DI:Dependency Injector
】指的是通過一定的規(guī)則管理對(duì)象間的依賴關(guān)系滋迈。依賴注入是控制反轉(zhuǎn)的一種實(shí)現(xiàn)方式。
控制反轉(zhuǎn)【IOC:Inversion of Control
】是一個(gè)重要的面向?qū)ο缶幊痰姆▌t户誓,用來削減計(jì)算機(jī)程序的耦合問題。他有兩種實(shí)現(xiàn)方式幕侠,1:依賴注入帝美;2:依賴查找。依賴注入是更好的IOC實(shí)現(xiàn)方式晤硕。
1.2. 作用
將各層的對(duì)象以松耦合的方式組織在一起悼潭,解耦,各層對(duì)象的調(diào)用完全面向接口舞箍。當(dāng)系統(tǒng)重構(gòu)的時(shí)候舰褪,代碼的改寫量將大大減少。
1.3. 實(shí)現(xiàn)方式
依賴注入有幾個(gè)實(shí)現(xiàn)方式:
- 基于接口
- 基于set()方法
- 基于構(gòu)造函數(shù)
- 基于注解
那么疏橄,安卓有哪些依賴注入框架呢占拍?
1.4. 依賴注入框架
-
Dagger
A fast dependency injector for Android and Java -
ButterKnife(JakeWharton)
Field and method binding for Android views which uses annotation processing to generate boilerplate code for you. -
Android Annotations
AndroidAnnotations is an Open Source framework that speeds up Android development.
It takes care of the plumbing, and lets you concentrate on what's really important.
By simplifying your code, it facilitates its maintenance. -
Transfuse
Transfuse is a Java Dependency Injection (DI) and integration library geared specifically for the Google Android API.
2. Dagger概述
假設(shè)我們有N多個(gè)頁面都要用到某個(gè)對(duì)象,也就是說本來需要在每個(gè)頁面里都實(shí)例化該對(duì)象才可以調(diào)用捎迫。Dagger可以幫我們把這個(gè)依賴對(duì)象的實(shí)例化工作做掉晃酒,我們只需要在需要用到該對(duì)象的類中添加注解(如:UserInfo對(duì)象):
@Inject
UserInfo userInfo;
之后我們就可以直接在該類中使用userInfo
這個(gè)對(duì)象了。
當(dāng)然有個(gè)前提窄绒,得先告訴Dagger怎么獲取這個(gè)實(shí)例化對(duì)象贝次。如下:
public class UserInfo{
@Inject
public UserInfo(){
}
public String getName(){
return "Lisa";
}
}
傳送門???Dagger-Github
Dagger官方文檔
看不懂?彰导?蛔翅?,換一個(gè):
Dagger中文文檔
2.1. 配置
在工程根目錄下的build.gradle文件中位谋,在buildscript的dependencies 中添加:
buildscript {
dependencies {
classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'
}
}
在app的build.gradle文件頂部添加插件:
apply plugin: 'com.neenbedankt.android-apt'
在dependencies中添加:
// apt command comes from the android-apt plugin
apt 'com.google.dagger:dagger-compiler:2.2'
compile 'com.google.dagger:dagger:2.2'
provided 'javax.annotation:jsr250-api:1.0'
2.2. 注解標(biāo)簽
@Module
:注入對(duì)象提供者所在的模塊山析,可理解為生產(chǎn)實(shí)例的工廠。
@Provides
:注入對(duì)象的提供者倔幼,告訴Dagger這是一個(gè)用于提供實(shí)例對(duì)象的函數(shù)
@Component
:用于注解接口盖腿。是連接被注入的類與需要被注入的類之間的紐帶。
@Inject
:注解預(yù)備被注入的類的構(gòu)造函數(shù),注解注入對(duì)象的實(shí)例翩腐。
@Named
:用于給@Provides
提供別名鸟款,使用的時(shí)候也加上別名。
@Singleton
:單例茂卦,有些類不需要用到不同的實(shí)例對(duì)象何什,就可以添加該注解,實(shí)現(xiàn)單例等龙。 但這個(gè)單例只是范圍內(nèi)的处渣。
注意:
- Provides函數(shù)以provide為前綴
- Module類以Module為后綴
參考資料:
[11]——MVP 模式之 先說說 Dagger (2)
個(gè)人覺得是篇不錯(cuò)的入門文章。
3. ButterKnife
3.1. 配置
- 在app中使用
dependencies {
compile 'com.jakewharton:butterknife:8.5.1'
annotationProcessor 'com.jakewharton:butterknife-compiler:8.5.1'
}
- 庫中使用配置
在build.gradle頂部添加插件:
apply plugin: 'com.android.library'
apply plugin: 'com.jakewharton.butterknife'
在buildscript中添加:
buildscript {
repositories {
mavenCentral()
}
dependencies {
classpath 'com.jakewharton:butterknife-gradle-plugin:8.5.1'
}
}
4.2. 使用
- 綁定View:
@BindView(R.id.main_recycler_list)
private RecyclerView mRecyclerView;
- 監(jiān)聽點(diǎn)擊事件
@OnClick(R.id.main_btn_tip)
public void showTip(View view){
Snackbar.make(view, "This is ButterKnife Demo!!!",Snackbar.LENGTH_LONG)
.setAction("Action", null).show();
}
- Activity/Fragment綁定ButterKnife
// 在setContentView(R.layout.layout_name)后面綁定
ButterKnife.bind(this);
4. Dagger與ButterKnife對(duì)比
ButterKnife只是做View的注入蛛砰,避免樣板代碼罐栈,代替findViewById()
;
Dagger能夠注入到任何你想要的對(duì)象泥畅,只要其在module類中荠诬。或者它是構(gòu)造器位仁。但是缺少對(duì)方法和字段的注入支持柑贞。
參考資料
聊聊 Android 中的依賴注入
Android Dagger依賴注入框架淺析
android依賴注入框架Dagger和Butterknife實(shí)戰(zhàn)
[11]——MVP 模式之 先說說 Dagger (2)
ButterKnife使用和原理
再次聲明,阿喵只是知識(shí)的搬運(yùn)工聂抢。钧嘶。。