偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

安卓平臺上的依賴注入(一)

移動開發(fā) Android
要注入依賴,首先需要告訴框架我們能提供什么(比如說上下文)以及特定的對象應(yīng)該怎樣創(chuàng)建。為了完成注入,我們用 @Module 注釋對一個特殊的類進(jìn)行了注解(這樣 Dagger 就能識別它了),尋找 @Provide 注解的方法,生成圖表,能夠返回我們所請求的對象。

剛開始學(xué)習(xí)軟件工程的時候,我們經(jīng)常會碰到像這樣的事情:

軟件應(yīng)該符合 SOLID 原則。

但這句話實(shí)際是什么意思?讓我們看看 SOLID 中每個字母在架構(gòu)里所代表的重要含義,例如:

  • S - 單職責(zé)原則
  • O - 開閉原則
  • L - Liskov 替換原則
  • I - 接口分離原則
  • D - 依賴反轉(zhuǎn)原則 這也是依賴注入(dependency injection)的核心概念。

簡單來說,我們需要提供一個類,這個類有它所需要的所有對象,以便實(shí)現(xiàn)其功能。

[[180033]]

概述

依賴注入聽起來像是描述非常復(fù)雜的東西的一個術(shù)語,但實(shí)際上它很簡單,看下面這個例子你就明白了:

  1. class NoDependencyInjection { 
  2.   private Dependency d; 
  3.   public NoDependencyInjection() { 
  4.     d = new Dependency(); 
  5.   } 
  6. class DependencyInjection { 
  7.   private Dependency d; 
  8.   public DependencyInjection(Dependency d) { 
  9.     this.d = d; 
  10.   } 

正如我們所見,***種情況是我們在構(gòu)造器里創(chuàng)建了依賴對象,但在第二種情況下,它作為參數(shù)被傳遞給構(gòu)造器,這就是我們所說的依賴注入(dependency injection)。這樣做是為了讓我們所寫的類不依靠特定依賴關(guān)系的實(shí)現(xiàn),卻能直接使用它。

參數(shù)傳遞的目標(biāo)是構(gòu)造器,我們就稱之為構(gòu)造器依賴注入;或者是某個方法,就稱之為方法依賴注入:

  1. class Example { 
  2.   private ConstructorDependency cd; 
  3.   private MethodDependency md; 
  4.   Example(ConstructorDependency cd) { 
  5.     this.cd = cd; //Constructor Dependency Injection 
  6.   } 
  7.   public setMethodDependency(MethodDependency md) { 
  8.     this.md = md; //Method Dependency Injection 
  9.   } 

要是你想總體深入地了解依賴注入,可以看看由 Dan Lew 發(fā)表的精彩的演講,事實(shí)上是這個演講啟迪了這篇概述。

在 Android 平臺,當(dāng)需要框架來處理依賴注入這個特殊的問題時,我們有不同的選擇,其中最有名的框架就是 Dagger 2。它最開始是由 Square 公司(LCTT 譯注:Square 是美國一家移動支付公司)的一些很棒的開發(fā)者開發(fā)出來的,然后慢慢發(fā)展成由 Google 自己開發(fā)。首先開發(fā)出來的是 Dagger 1,然后 Big G 接手這個項(xiàng)目發(fā)布了第二個版本,做了很多改動,比如以注解(annotation)為基礎(chǔ),在編譯的時候完成其任務(wù)。

導(dǎo)入框架

安裝 Dagger 并不難,但需要導(dǎo)入 android-apt 插件,通過向項(xiàng)目的根目錄下的 build.gradle 文件中添加它的依賴關(guān)系:

  1. buildscript{ 
  2.   ... 
  3.   dependencies{ 
  4.     ... 
  5.     classpath ‘com.neenbedankt.gradle.plugins:android-apt:1.8’ 
  6.   } 

然后,我們需要將 android-apt 插件應(yīng)用到項(xiàng)目 build.gradle 文件,放在文件頂部 Android application 那一句的下一行:

  1. apply plugin: ‘com.neenbedankt.android-apt’ 

這個時候,我們只用添加依賴關(guān)系,然后就能使用庫及其注解(annotation)了:

  1. dependencies{ 
  2.     ... 
  3.     compile ‘com.google.dagger:dagger:2.6’  
  4.     apt ‘com.google.dagger:dagger-compiler:2.6’ 
  5.     provided ‘javax.annotation:jsr250-api:1.0’ 

需要加上***一個依賴關(guān)系是因?yàn)?@Generated 注解在 Android 里還不可用,但它是原生的 Java 注解。

Dagger 模塊

要注入依賴,首先需要告訴框架我們能提供什么(比如說上下文)以及特定的對象應(yīng)該怎樣創(chuàng)建。為了完成注入,我們用 @Module 注釋對一個特殊的類進(jìn)行了注解(這樣 Dagger 就能識別它了),尋找 @Provide 注解的方法,生成圖表,能夠返回我們所請求的對象。

看下面的例子,這里我們創(chuàng)建了一個模塊,它會返回給我們 ConnectivityManager,所以我們要把 Context 對象傳給這個模塊的構(gòu)造器。

  1. @Module 
  2. public class ApplicationModule { 
  3.   private final Context context; 
  4.   public ApplicationModule(Context context) { 
  5.     this.context = context; 
  6.   } 
  7.   @Provides @Singleton 
  8.   public Context providesContext() { 
  9.     return context; 
  10.   } 
  11.   @Provides @Singleton 
  12.   public ConnectivityManager providesConnectivityManager(Context context) { 
  13.     return (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); 
  14.   } 

Dagger 中十分有意思的一點(diǎn)是簡單地注解一個方法來提供一個單例(Singleton),就能處理所有從 Java 中繼承過來的問題。

組件

當(dāng)我們有一個模塊的時候,我們需要告訴 Dagger 想把依賴注入到哪里:我們在一個組件(Component)里完成依賴注入,這是一個我們特別創(chuàng)建的特殊注解接口。我們在這個接口里創(chuàng)造不同的方法,而接口的參數(shù)是我們想注入依賴關(guān)系的類。

下面給出一個例子并告訴 Dagger 我們想要 MainActivity 類能夠接受 ConnectivityManager(或者在圖表里的其它依賴對象)。我們只要做類似以下的事:

  1. @Singleton 
  2. @Component(modules = {ApplicationModule.class}) 
  3. public interface ApplicationComponent { 
  4.   void inject(MainActivity activity); 

正如我們所見,@Component 注解有幾個參數(shù),一個是所支持的模塊的數(shù)組,代表它能提供的依賴。這里既可以是 Context 也可以是 ConnectivityManager,因?yàn)樗鼈冊?ApplicationModule 類中有聲明。

用法

這時,我們要做的是盡快創(chuàng)建組件(比如在應(yīng)用的 onCreate 階段)并返回它,那么類就能用它來注入依賴了:

為了讓框架自動生成 DaggerApplicationComponent,我們需要構(gòu)建項(xiàng)目以便 Dagger 能夠掃描我們的代碼,并生成我們需要的部分。

在 MainActivity 里,我們要做的兩件事是用 @Inject 注解符對想要注入的屬性進(jìn)行注解,調(diào)用我們在 ApplicationComponent 接口中聲明的方法(請注意后面一部分會因我們使用的注入類型的不同而變化,但這里簡單起見我們不去管它),然后依賴就被注入了,我們就能自由使用他們:

  1. public class MainActivity extends AppCompatActivity { 
  2.   @Inject 
  3.   ConnectivityManager manager; 
  4.   @Override 
  5.   protected void onCreate(Bundle savedInstanceState) { 
  6.     ... 
  7.     ((App) getApplication()).getComponent().inject(this); 
  8.   } 

總結(jié)

當(dāng)然了,我們可以手動注入依賴,管理所有不同的對象,但 Dagger 消除了很多比如模板這樣的“噪聲”,給我們提供有用的附加品(比如 Singleton),而僅用 Java 處理將會很糟糕。

責(zé)任編輯:龐桂玉 來源: Linux中國
相關(guān)推薦

2012-08-22 11:12:11

Ubuntu

2018-11-01 10:45:24

2022-01-21 10:35:03

Windows 11微軟安卓

2013-06-24 17:20:29

x86平臺優(yōu)化安卓x86

2013-12-12 16:23:53

安卓進(jìn)化AndroidGoogle

2022-12-29 08:54:53

依賴注入JavaScript

2023-06-27 08:58:13

quarkusBean

2012-06-12 09:43:34

微軟Linux服務(wù)

2009-01-16 09:10:39

JavaCRM系統(tǒng)企業(yè)應(yīng)用

2015-09-02 11:22:36

JavaScript實(shí)現(xiàn)思路

2011-05-31 10:00:21

Android Spring 依賴注入

2015-10-09 10:32:21

代碼依賴注入強(qiáng)心劑

2017-02-23 13:51:05

2019-11-26 14:52:40

Linux工具寫作者

2010-12-22 21:52:12

rkhunter

2013-05-30 09:14:41

手游安卓平臺推廣

2023-07-11 09:14:12

Beanquarkus

2024-05-27 00:13:27

Go語言框架

2021-01-22 06:35:44

IoCxml驅(qū)動技術(shù)

2022-04-11 09:02:18

Swift依賴注
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號