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