日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dagger2 依赖注入

發布時間:2025/4/16 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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' // dagger2

annotation?, 提供?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 依赖注入的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。