Dagger2系列教程目錄:
史上最適合新手的Dagger2教程(五)命名、限定與延時(shí)加載
0.檢查作業(yè)
對(duì)答案了對(duì)答案了,后面那排睡覺(jué)的挠唆,起來(lái)做筆記了酷窥!
杠精類:
public class GangJing {
@Inject
public GangJing() {
}
public void gang(Activity activity) {
Toast.makeText(activity, "這摳腳大漢天天賣萌", Toast.LENGTH_SHORT).show();
}
}
注入器:
注入器和上節(jié)課寫(xiě)的是一樣的懒棉,不需要修改~
@Component
public interface MainActivityComponent {
void inject(MainActivity mainActivity);
}
注入和調(diào)用:
public class MainActivity extends AppCompatActivity {
@Inject
GangJing gangJing;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainActivityComponent.create().inject(this);
gangJing.gang(this);
}
}
那么這節(jié)課我們基于上節(jié)課的作業(yè)繼續(xù)講解Dagger2.
· 對(duì)象注入
有時(shí)候我們的項(xiàng)目嚣伐,需要?jiǎng)?chuàng)建A和B兩個(gè)對(duì)象哭廉,其中B對(duì)象需要用到A的實(shí)例怀跛,如:
A a = new A();
B b = new B(a);
這個(gè)時(shí)候奇昙,我們就要用到Dagger2的對(duì)象注入了。
我們把上節(jié)課的賣萌類拿過(guò)來(lái):
public class SellMoe {
@Inject
public SellMoe() {
}
public String sellMoe() {
return "趕緊賣了個(gè)大萌";
}
}
然后改造一下作業(yè)里的杠精類:
在內(nèi)部聲明一個(gè)賣萌類對(duì)象敌完,在構(gòu)造方法中傳入它储耐;
然后添加一個(gè)方法看它賣萌(lookAtHim),調(diào)用賣萌類的方法滨溉。
public class GangJing {
//新增一個(gè)賣萌對(duì)象
SellMoe sellMoe;
//修改構(gòu)造方法什湘,傳入賣萌對(duì)象
public GangJing(SellMoe sellMoe) {
this.sellMoe = sellMoe;
}
//添加一個(gè)調(diào)用賣萌對(duì)象的方法
public String lookAtHim() {
return sellMoe.sellMoe();
}
public void gang(Activity activity) {
Toast.makeText(activity, "這摳腳大漢天天賣萌", Toast.LENGTH_SHORT).show();
}
}
先不使用Dagger2:
public class MainActivity extends AppCompatActivity {
SellMoe sellMoe;
GangJing gangJing;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tv = findViewById(R.id.tv);
//關(guān)鍵代碼
sellMoe = new SellMoe();
gangJing = new GangJing(sellMoe);
tv.setText(gangJing.lookAtHim());
gangJing.gang(this);
}
}
運(yùn)行一下:
要把SellMoe注入到GangJing里面去,只要在傳入SellMoe的構(gòu)造方法上加上@Inject就好:
public class GangJing {
SellMoe sellMoe;
@Inject
public GangJing(SellMoe sellMoe) {
this.sellMoe = sellMoe;
}
public String lookAtHim() {
return sellMoe.sellMoe();
}
public void gang(Activity activity) {
Toast.makeText(activity, "這摳腳大漢天天賣萌", Toast.LENGTH_SHORT).show();
}
}
Step2:注入對(duì)象
注入器(@Component)依然使用作業(yè)里的注入器晦攒,無(wú)需修改~
直接在MainActivity里調(diào)用就OK:
public class MainActivity extends AppCompatActivity {
//注意這里沒(méi)有聲明SellMoe對(duì)象闽撤!
@Inject
GangJing gangJing;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注入對(duì)象
DaggerMainActivityComponent.create().inject(this);
TextView tv = findViewById(R.id.tv);
tv.setText(gangJing.lookAtHim());
gangJing.gang(this);
}
}
注意這里沒(méi)有聲明SellMoe對(duì)象,但是運(yùn)行一下脯颜,發(fā)現(xiàn)并沒(méi)有爆出空指針異常哟旗,
這說(shuō)明Dagger2已經(jīng)自動(dòng)幫我們把SellMoe給注入到了GangJing類里了,厲害吧~
這就是Dagger2厲害到不行的智能對(duì)象注入,它在你用@Inject標(biāo)記GangJing的構(gòu)造方法的時(shí)候闸餐,就已經(jīng)幫你創(chuàng)建好SellMoe對(duì)象了:
@Inject
public GangJing(SellMoe sellMoe) {
this.sellMoe = sellMoe;
}
基于此功能饱亮,使用Dagger2開(kāi)發(fā)的項(xiàng)目,在構(gòu)造方法被修改時(shí)無(wú)需修改調(diào)用處的代碼舍沙,而且可以避免幾乎所有的空指針近上!
有點(diǎn)開(kāi)始懵逼了?那我用類比的方式說(shuō)明一下:
@Inject
Object obj;
這個(gè)代碼拂铡,相當(dāng)于:
Object obj = new Object();
而這個(gè)代碼:
ObjectA objA;
@Inject
public ObjectB(ObjectA objA){
this.objA = objA;
}
則相當(dāng)于:
ObjectA objA;
public ObjectB(ObjectA objA){
this.objA = new ObjectA();
}
把@Inject注解理解成new操作壹无,是不是就好理解了~
2.注意事項(xiàng)
值得一提的是,Dagger2在@Inject注入的時(shí)候感帅,每次都會(huì)new一個(gè)對(duì)象斗锭。
比如我們給SellMoe加上一個(gè)字段id:
public class SellMoe {
public int id;
@Inject
public SellMoe() {
}
public String sellMoe() {
return "趕緊賣了個(gè)大萌";
}
}
在調(diào)用lookAtHim的時(shí)候打印一下id:
public String lookAtHim() {
Log.e("GangJingSellMoeID", sellMoe.id + "");
return sellMoe.sellMoe();
}
在MainActivity中同樣注入一個(gè)SellMoe對(duì)象,給它的id賦值為1:
public class MainActivity extends AppCompatActivity {
@Inject
SellMoe sellMoe;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
DaggerMainActivityComponent.create().inject(this);
sellMoe.id = 1;
Log.e("MainSellMoeID", sellMoe.id + "");
再執(zhí)行一次代碼:
看到了嗎失球,他們是兩個(gè)不一樣的賣萌類~
那么如果需要用到單例怎么辦呢拒迅?