Dagger2系列教程目錄:
史上最適合新手的Dagger2教程(五)命名虎眨、限定與延時(shí)加載
上節(jié)課我們講到蟋软,有些類(lèi)存在有參和無(wú)參兩種構(gòu)造方法镶摘,而這兩種構(gòu)造方法此時(shí)要用到同一個(gè)類(lèi)下,怎么辦岳守?
比如說(shuō)我們現(xiàn)在有一個(gè)計(jì)數(shù)器Counter凄敢,有帶參和不帶參兩種構(gòu)造方法:
public class Counter {
private int sum;
public Counter() {
}
public Counter(int sum) {
this.sum = sum;
}
public int getSum() {
return sum++;
}
}
此時(shí)我要記錄本次打開(kāi)APP的計(jì)數(shù)和總計(jì)的計(jì)數(shù):
public class MainActivity extends AppCompatActivity {
Counter currentCounter;
Counter totalCounter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
currentCounter = new Counter();
totalCounter = new Counter(10);
}
}
水啦~
按照上節(jié)課的內(nèi)容,我們先把模型湿痢、提供者和注入器寫(xiě)好:
模型與提供者:
需要注意的是:同一個(gè)模型下的提供者的方法名不能雷同涝缝,無(wú)論參數(shù)是否相同。這個(gè)和常規(guī)的Java代碼有出入蒙袍,請(qǐng)牢記俊卤!
@Module
public class CounterMoudule {
private int sum;
public CounterMoudule(int sum) {
this.sum = sum;
}
@Provides
public int sumProvider() {
return this.sum;
}
@Provides
public Counter currentCounterProvider() {
return new Counter();
}
@Provides
public Counter totalCunterProvider(int sum) {
return new Counter(sum);
}
}
注入器:
@Component(modules = CounterMoudule.class)
public interface CounterComponent {
void inject(MainActivity mainActivity);
}
接下來(lái),我們用兩種方式實(shí)現(xiàn)區(qū)分注入害幅。
1.命名(@Named)
Named,顧名思義——起名字岂昭,我們給這兩個(gè)不同的計(jì)數(shù)器起不同的名字以现,問(wèn)題自然迎刃而解。
@Named注釋標(biāo)記的是提供者和使用對(duì)象:
標(biāo)記提供者:
@Module
public class CounterMoudule {
......
@Provides
@Named("current")
public Counter currentCounterProvider() {
return new Counter();
}
@Provides
@Named("total")
public Counter totalCunterProvider(int sum) {
return new Counter(sum);
}
}
標(biāo)記使用對(duì)象:
public class MainActivity extends AppCompatActivity {
@Named("current")
@Inject
Counter currentCounter;
@Named("total")
@Inject
Counter totalCounter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerCounterComponent.builder().counterMoudule(new CounterMoudule(10)).build().inject(this);
Log.e("current", currentCounter.getSum() + "");
Log.e("total", totalCounter.getSum() + "");
}
}
運(yùn)行結(jié)果:
2.限定(@Qualifier)
Qualifier限定约啊,由于Named是通過(guò)匹配字符串作為區(qū)分條件邑遏,在大項(xiàng)目中顯得不夠嚴(yán)謹(jǐn),于是就有了限定這個(gè)注解恰矩。
@Qualifier注解標(biāo)記的是:自定義注解记盒,對(duì)Java注解方面的知識(shí)要求較高,不了解的同學(xué)可以先去學(xué)習(xí)一下Java自定義注解:
自定義當(dāng)前計(jì)數(shù)器注解:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface CurrentCounter {
}
自定義總計(jì)數(shù)器注解:
@Qualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface TotalCounter {
}
注意:被限定標(biāo)記的注解必須是運(yùn)行時(shí)注解外傅。
其余地方把@Named替換成自定義注解即可:
提供者:
@Module
public class CounterMoudule {
......
@Provides
@CurrentCounter
public Counter currentCounterProvider() {
return new Counter();
}
@Provides
@TotalCounter
public Counter totalCunterProvider(int sum) {
return new Counter(sum);
}
}
標(biāo)記使用對(duì)象:
public class MainActivity extends AppCompatActivity {
@CurrentCounter
@Inject
Counter currentCounter;
@TotalCounter
@Inject
Counter totalCounter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerCounterComponent.builder().counterMoudule(new CounterMoudule(10)).build().inject(this);
Log.e("current", currentCounter.getSum() + "");
Log.e("total", totalCounter.getSum() + "");
}
}
3.懶加載
最后纪吮,我們介紹一下Dagger2的大殺器!——智能懶加載萎胰。
懶加載碾盟,就是在需要的時(shí)候才對(duì)成員變量進(jìn)行初始化,這樣可以大幅縮短應(yīng)用初始化的時(shí)間技竟。
我們只要使用Lazy<T>修飾變量即可:
@Inject
Lazy<Object> object;
End.
Dagger2的所有基礎(chǔ)知識(shí)就在這里了冰肴,怎么樣,是不是非常簡(jiǎn)單呢榔组?
喜歡我教程風(fēng)格的朋友請(qǐng)不要客氣的關(guān)注一下嘛~