dagger2 依赖注入
前言:
當 mvp + dagger2 + rxjava 三者遇上,架構更加清晰,代碼更加靈活,巧妙結合。
依賴注入:是為了解耦,達到高內聚低耦合的目的,保證代碼的健壯性、靈活性和可維護性。
1 public class Computer{ 2 3 private Cpu cpu; 4 5 public Computer(){ 6 cpu= new Cpu(); 7 } 8 }Computer類持有了對Cpu實例的引用,稱之為Computer類對Cpu類有一個依賴。
依賴注入則是指通過注入的方式實現類與類之間的依賴。
1、構造注入:通過構造函數傳參,給依賴的成員變量賦值,因此實現注入。
1 public class Computer{ 2 3 private Cpu cpu; 4 5 public Computer(Cpu cpu){ 6 this.cpu= cpu; 7 } 8 }2、接口注入:實現事先定義好的接口方法,通過方法傳參的方式實現注入。
public interface Injection<T>{void inject(T t); }public class Computer implements Injection<Cpu>{private Cpu cpu;public Computer(){}public void inject(Cpu cpu){this.cpu= cpu;}}3、注解注入:使用Java注解,在編譯階段生成代碼實現注入或者是在運行階段通過反射實現注入。
public class Computer{@Injectprivate Cpu cpu;public Computer(){}}Dagger2是通過Java注解在編譯期來實現依賴注入的。
Dagger2的常用注解:
@Inject:
1、用來標記需要依賴的變量,須為它提供依賴;
2、是用來標記構造函數,Dagger2通過@Inject注解可以在需要這個類實例的時候來找到這個構造函數并把相關實例構造出來,以此來為被@Inject標記了的變量提供依賴;
@Module:
用于標注提供依賴的類。當構造函數帶有參數,或者是第三方庫類時,所須使用的。
@Provides:
用于標注Module所標注的類中的方法,該方法在需要提供依賴時被調用,把預先提供好的對象當做依賴給標注了@Inject的變量賦值;
@Component:
用于標注接口,是依賴需求方和依賴提供方之間的橋梁。被Component標注的接口在編譯時會生成該接口的實現類(如果@Component標注的接口為CarComponent,則編譯期生成的實現類為DaggerCarComponent),我們通過調用這個實現類的方法完成注入;
@Scope:
用于自定義注解,我能可以通過@Scope自定義的注解來限定注解作用域,實現局部的單例;
@Singleton:
其實就是一個通過@Scope定義的注解,我們一般通過它來實現全局單例。但實際上它并不能提前全局單例,是否能提供全局單例還要取決于對應的Component是否為一個全局對象。
?
案例一:
沒有使用注入時:
public class MainActivity extends ActionBarActivity {@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);User user = new User();((TextView) findViewById(R.id.tv_username)).setText("user name:" + user.name);}... }使用注入時:
設置?build.gradle?, 并添加依賴庫.
android-apt?, 提供?dagger2使用編譯生成類?的功能.
1 buildscript { 2 repositories { 3 jcenter() 4 } 5 dependencies { 6 classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' 7 } 8 } 9 10 apply plugin: 'com.neenbedankt.android-apt' // 注釋處理dagger2?, 提供?dagger2支持?的功能.
1 compile 'com.google.dagger:dagger:2.0.2' // dagger2 2 compile 'com.google.dagger:dagger-compiler:2.0.2' // dagger2annotation?, 提供?java注釋解析?的功能.
1 provided 'javax.annotation:jsr250-api:1.0' // Java標注配置完成后:
首先定義Module類來生成依賴對象。使用@Provides是用來標注具體提供依賴對象的方法。
1 @Module 2 public class DataModule { 3 4 @Provides 5 UserModel provideUser() { 6 return new User(); 7 } 8 }定義component:注入器,加上modules = {DataModule.class},是用來告訴Dagger2提供依賴的是DataModule這個類:
1 @Component(modules = DataModule.class) 2 public interface ActivityComponent { 3 void inject(MainActivity activity); 4 }最后使用方式:構建時,使用dataModule(new DataModule()),注入器DaggerActivityComponent把DataModule提供的依賴 注入到 MainActivity中,注入,使用
1 public class MainActivity extends ActionBarActivity { 2 3 private ActivityComponent mActivityComponent; 4 5 @Inject 6 User user; 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_main); 12 13 // 構建 14 mActivityComponent = DaggerActivityComponent.builder().dataModule(new DataModule()).build(); 15 16 // 注入 17 mActivityComponent.inject(this); 18 19 ((TextView) findViewById(R.id.tv_username)).setText("user name:" + user.username); 20 } 21 ... 22 }?
附言:
Dagger2使用
詳解Dagger2
神兵利器Dagger2
當復仇者聯盟遇上Dagger2、RxJava和Retrofit的巧妙結合
?MVP+Dagger2+Retrofit實現更清晰的架構
Android 依賴注入: Dagger 2 實例講解(一)
Dragger 2遇到的坑 Dragger2詳解 Dragger2學習最好的資料
轉載于:https://www.cnblogs.com/CharlesGrant/p/5312159.html
總結
以上是生活随笔為你收集整理的dagger2 依赖注入的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 常用js函数收录
- 下一篇: Codeforces Round #29