史上最適合新手的Dagger2教程(二)對(duì)象注入

Dagger2系列教程目錄:

史上最適合新手的Dagger2教程(一)基本注入

史上最適合新手的Dagger2教程(二)對(duì)象注入

史上最適合新手的Dagger2教程(三)模型與單例

史上最適合新手的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è)不一樣的賣萌類~

那么如果需要用到單例怎么辦呢拒迅?

且聽(tīng)下回分解~

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市她倘,隨后出現(xiàn)的幾起案子璧微,更是在濱河造成了極大的恐慌,老刑警劉巖硬梁,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件前硫,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡荧止,警方通過(guò)查閱死者的電腦和手機(jī)屹电,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)跃巡,“玉大人危号,你說(shuō)我怎么就攤上這事∷匦埃” “怎么了外莲?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)兔朦。 經(jīng)常有香客問(wèn)我偷线,道長(zhǎng),這世上最難降的妖魔是什么沽甥? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任声邦,我火速辦了婚禮,結(jié)果婚禮上摆舟,老公的妹妹穿的比我還像新娘亥曹。我一直安慰自己邓了,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布媳瞪。 她就那樣靜靜地躺著骗炉,像睡著了一般。 火紅的嫁衣襯著肌膚如雪材失。 梳的紋絲不亂的頭發(fā)上痕鳍,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天硫豆,我揣著相機(jī)與錄音龙巨,去河邊找鬼。 笑死熊响,一個(gè)胖子當(dāng)著我的面吹牛旨别,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播汗茄,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼秸弛,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了洪碳?” 一聲冷哼從身側(cè)響起递览,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎瞳腌,沒(méi)想到半個(gè)月后绞铃,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡嫂侍,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年儿捧,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片挑宠。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡菲盾,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出各淀,到底是詐尸還是另有隱情懒鉴,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布碎浇,位于F島的核電站疗我,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏南捂。R本人自食惡果不足惜吴裤,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望溺健。 院中可真熱鬧麦牺,春花似錦钮蛛、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至吱晒,卻和暖如春甸饱,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仑濒。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工叹话, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人墩瞳。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓驼壶,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親喉酌。 傳聞我的和親對(duì)象是個(gè)殘疾皇子热凹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容