Dagger2 灏忚

0x00 寮�濮�

浠ユ渶鏃犺叮鐨� 鈥淗ello World鈥� 寮�濮嬪惂銆�

public class Hello {
    
    public String greeting(){
        return "Hello World.";
    }
    
}

鐒跺悗鍦� TextView 涓樉绀猴紝甯歌鐨勬柟娉曟槸锛�

Hello hello = new Hello();
textViewHello.setText(hello.greeting());

閭d箞锛屽鏋滀娇鐢� Dagger2 杩涜渚濊禆娉ㄥ叆锛屾垜浠娇鐢� @Inject 灏� Hello 瀹炰緥娉ㄥ叆锛�

@Inject Hello hello;

...

textViewHello.setText(hello.greeting());

杩欓噷瀛樺湪涓�涓棶棰橈細瑕佹�庝箞瀹炰緥鍖� Hello 鍛�? Dagger2 鎻愪緵 @Inject 鏍囨敞锛屽湪鏋勯�犲嚱鏁颁腑鏍囨敞鍚庯紝褰撻渶瑕佸疄渚嬪寲鏃讹紝Dagger2 灏变細璋冪敤杩欎釜鏋勯�犲嚱鏁帮細

@Singleton
public class Hello {

    @Inject public Hello() {}
    
    public String greeting(){
        return "Hello World.";
    }
    
}

PS: 鍔犲叆 Hello 涔熼渶瑕佹敞鍏ュ叾浠栫被鍛紵 @Inject 鍚屾牱杞绘澗鎼炲畾锛屾瀯閫犲嚱鏁板弬鏁颁互鍙婄被鎴愬憳灞炴�у潎鍙交鏉炬敞鍏ャ��

杩欐椂渚濈劧鏃犳硶宸ヤ綔锛屽鏋滀綘杩愯绋嬪簭锛屼細浜х敓鎮蹭激鐨� NullPointerException锛岄偅涔堣繕宸粈涔堝憿锛�

鎴戜滑闇�瑕佸垱寤轰竴涓狢omponent锛孋omponent鏄疨rovider鍜孖njector涔嬮棿鐨勬ˉ姊併��

@Singleton
@Component
public interface DemoComponent {

    void inject(MainActivity activity);

}

Dagger2 浼氳嚜鍔ㄧ敓鎴愪竴涓� DaggerDemoComponent锛屽湪 Activity 涓皟鐢ㄦ敞鍏ワ細

DaggerDemoComponent.create().inject(this);

鎵撳畬鏀跺伐锛�

褰撶劧锛屼綘杩橀渶瑕侀�氳繃 gradle 寮曞叆 Dagger2:

...
apply plugin: 'com.neenbedankt.android-apt'

buildscript {
    repositories {
        jcenter()
    }

    dependencies {
        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.4'
    }
}

...

dependencies {
    ...
    provided 'javax.annotation:javax.annotation-api:1.2'
    apt 'com.google.dagger:dagger-compiler:2.0.2'
    compile 'com.google.dagger:dagger:2.0.2'
}

0x01 杩涢樁

濡備笂鎵�杩帮紝鎴戜滑鑷繁鍐欑殑浠g爜鍙互閫氳繃 @Inject 瀹炰緥鍖栧苟娉ㄥ叆锛屼絾鑻ユ槸绗笁鏂瑰簱鎻愪緵鐨勭被鍛紵

杩欐椂闇�瑕佺敤鍒� @Module, @Provide:

@Module

Module 鏄嫢鏈夊彲浠ユ彁渚涗緷璧栫殑鍑芥暟鐨勭被锛屾垜浠畾涔変竴涓被锛屾爣娉ㄤ负 @Module,鐒跺悗 Dagger2 灏辩煡閬撳摢閲屽彲浠ユ壘鍒版瀯寤轰竴涓璞℃墍闇�瑕佺殑渚濊禆鍟︺�傝�屼笖 Module 琚璁′负鍙互琚垎鍓插拰缁勫悎鐨勬ā寮忥紝鏈夌泭浜庢ā鍧楃殑鍒掑垎銆�

@Provide

鍦ㄦ爣娉ㄤ负 @Module 鐨勭被涓殑鍑芥暟鍙互鏍囨敞涓� @Provide, 鏍囩ず鍙互鎻愪緵鐩稿簲鐨勪緷璧栵紝鍑芥暟鐨勫墠缂�蹇呴』涓� provides.

@Module
public class DemoModule {

    @Provides @Singleton
    public GithubService provideGithubService() {
        return new GithubService();
    }

}

鐒跺悗鎴戜滑瑕佸憡鐭� Component 浣跨敤杩欎釜 Module:

@Singleton
@Component(modules = {DemoModule.class})
public interface DemoComponent {

    void inject(MainActivity activity);

}

@Component 鍙互閫氳繃 dependencies 鐢虫槑渚濊禆渚濅粬鐨� @Component銆�

@Singleton

杩欐槸鏍囩ず涓�涓崟渚嬬殑娉ㄩ噴锛屽彲浠ュ拰 @Provide 鍏卞悓鏍囨敞涓�涓嚱鏁帮紝鏍囩ず杩欎釜鍑芥暟杩斿洖鐨勫璞¢兘鏄崟渚嬬殑锛屼篃鍙互鍜� @Component 涓�璧锋爣娉ㄤ竴涓狢omponent锛屾爣绀鸿繖涓� Component 鐨� Scope 鏄叏灞�鐨勩��

@Scope

Scopes 闈炲父鐨勬湁鐢紝Dagger2 鍙互閫氳繃鑷畾涔夋敞瑙i檺瀹氭敞瑙d綔鐢ㄥ煙銆�

@Qualifier

褰撶被鐨勭被鍨嬩笉瓒充互閴村埆涓�涓緷璧栫殑鏃跺�欙紝鎴戜滑灏卞彲浠ヤ娇鐢ㄨ繖涓敞瑙f爣绀恒��

渚嬪锛氬湪Android涓紝鎴戜滑浼氶渶瑕佷笉鍚岀被鍨嬬殑 Context锛屾墍浠ユ垜浠氨鍙互瀹氫箟 Qualifier 娉ㄨВ @ForApplication 鍜� @ForActivity锛岃繖鏍峰綋娉ㄥ叆涓�涓� Context 鐨勬椂鍊欙紝鎴戜滑灏卞彲浠ュ憡璇� Dagger 鎴戜滑鎯宠鍝绫诲瀷鐨� Context銆�

0x02 鍙傝��

Dagger 2

Tasting Dagger 2 on Android

Dependency injection with Dagger 2 - the API

你可能感兴趣的:(Dagger2 灏忚)