編輯:Android資訊
Dagger2是Dagger1的分支,早期有square開發,現在由谷歌公司接手。
他要解決問題和核心是:利用生成和寫的代碼混合達到看似所有的產生和提供依賴的代碼都是手寫的樣子。
官方Github地址:https://github.com/google/dagger
官方主頁:http://google.github.io/dagger/
首先大概解釋下Dagger中幾個角色(或者說是幾個注解):
@Inject:這個很簡單了,通常是在需要注入的地方添加這個依賴。比如:MainActivity要使用LocalManager實例,那我們就在要使用的地方定義一個成員變量
@Inject LocationManager locationManager;
注意:不能是private修飾的
@Module:就是真正提供依賴的類了。所以我們定義一個類,用@Module注解,這樣Dagger在構造類的實例的時候,就知道從哪裡去找到需要的 依賴。modules的一個重要特征是它們設計為分區並組合在一起(比如說,在我們的app中可以有多個組成在一起的modules)。所以我們這裡可以定義一個AppApplication類用來提供全局依賴,可以是ApiService,Retrofit,OKHttp,LocalManager,Context等
@Module public class AppApplicationModule { ... }
@Provides:就是寫在Module中某些方法上,表示這個方法提供依賴
@Provides @Singleton LocationManager provideLocationManager() { return (LocationManager) application.getSystemService(LOCATION_SERVICE); }
@Component: 是@Inject和@Module的橋梁,它的主要作用就是連接這兩個部分。 Components可以提供所有定義了的類型的實例。
@Singleton @Component(modules = AppApplicationModule.class) public interface ApplicationComponent { void inject(MainActivity demoActivity); }
基本的注解我就講解到這裡,下面寫一個小實例
首先創建一個Android項目,然後在項目的build.grade,添加android-apt依賴
buildscript { ... dependencies { ... classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8' ... } }
然後在app的build.gradle添加
apply plugin: 'com.neenbedankt.android-apt'
然後在添加依賴
dependencies { ... apt "com.google.dagger:dagger-compiler:2.2" provided 'org.glassfish:javax.annotation:10.0-b28' compile "com.google.dagger:dagger:2.2" ... }
到這一步可以build下,看看配置是否正確,我們下面要做的就是上面說的,給MainActivity提供LocalManager,對,就這麼一點,不然寫多了大家又懵逼了
首先創建一個AppApplication類,他是一個Application子類,需要在清檔文件配置,之所有要創建他是因為,我們要在這裡提供一些全局依賴
public class AppApplication extends Application{ @Override public void onCreate() { super.onCreate(); } }
記得在清單文件配置喲~
上面說了這是一個真正提供依賴的類,其中一些方法要用@Provides修飾
@Module public class AppApplicationModule { private final Context context; public AppApplicationModule(Context context) { this.context=context; } //標示這個方法可以提供LocationManager @Provides @Singleton LocationManager provideLocationManager() { return (LocationManager) context.getSystemService(LOCATION_SERVICE); } }
同樣也說了,他是Module和Inject之間的橋梁,我們幫他創建到了AppApplication內部
@Singleton @Component(modules = AppApplicationModule.class) public interface ApplicationComponent { void inject(MainActivity demoActivity); }
public class AppApplication extends Application { private ApplicationComponent component; @Override public void onCreate() { super.onCreate(); component = DaggerAppApplication_ApplicationComponent.builder().appApplicationModule(new AppApplicationModule(this)).build(); component.inject(this); } @Singleton @Component(modules = AppApplicationModule.class) public interface ApplicationComponent { void inject(MainActivity demoActivity); void inject(AppApplication application); } public ApplicationComponent component() { return component; } }
public class MainActivity extends AppCompatActivity { //可以看到我們沒有顯示的初始化LocationManager @Inject LocationManager locationManager; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); TextView tv_info = (TextView) findViewById(R.id.tv_info); //注解依賴 ((AppApplication) getApplication()).component().inject(this); tv_info.setText(locationManager.toString()); } }
好這就是一個最最基本的Dagger注入例子了,下一篇我們來詳細分析下他的實現原理或者再寫一個MVP架構例子,感謝你的閱讀。源代碼下載地址:https://github.com/lifengsofts/AndroidDagger2
Android開發60條技術經驗總結,以下是全文: 1. 全部Activity可繼承自BaseActivity,便於統一風格與處理公共事件,構建對話框統一構建器
前言 本文主要來分享一個Android UI開發中實現廣告Banner的輪播效果,因為Banner效果在Android應用中比較常見,所以我們也來嘗試實現以下。下
LinearLayout是在線性方向顯示View元素的一個ViewGroup,可以是水平方向,也可以是垂直方向 你可以重復使用LinearLayout,如果你想使
Android中的TTextView很強大,我們可以不僅可以設置純文本為其內容,還可以設置包含網址和電子郵件地址的內容,並且使得這些點擊可以點擊。但是我們可以捕獲