Dagger2系列教程目錄:
史上最適合新手的Dagger2教程(五)命名、限定與延時(shí)加載
前面我們講解了構(gòu)造方法中不帶參數(shù)的各種注入方式,
這節(jié)課,我們來學(xué)習(xí)構(gòu)造方法中帶參數(shù)的對(duì)象如何使用Dagger2注入。
· 常規(guī)實(shí)現(xiàn)
我們先不使用Dagger2,以常規(guī)的方式注入一個(gè)帶參構(gòu)造的對(duì)象:
帶參構(gòu)造類:
public class SellMoe {
private int age;
public SellMoe(int age) {
this.age = age;
}
public String sellMoe() {
return "我特么" + age + "歲了還是可愛得要死";
}
}
常規(guī)調(diào)用:
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.textView);
SellMoe sellMoe = new SellMoe(80);
textView.setText(sellMoe.sellMoe());
}
}
運(yùn)行結(jié)果:

接下來我們使用Dagger2來注入它。
· Dagger2注入
下面所用到的注解,在上節(jié)課有詳細(xì)的說明,如果不熟練請(qǐng)回顧上一節(jié)。
Step1:創(chuàng)建帶參構(gòu)造模型(@Module)
對(duì)于帶參構(gòu)造的對(duì)象,必須使用@Module注入;并且這個(gè)模型必須有一個(gè)帶參的構(gòu)造方法。
@Module
public class SellMoeModule {
private int age;
public SellMoeModule(int age) {
this.age = age;
}
}
Step2:創(chuàng)建帶參提供者(@Provides)
除了提供帶參的對(duì)象的提供者以外,還要有提供參數(shù)的提供者,二者缺一不可:
@Module
public class SellMoeModule {
private int age;
public SellMoeModule(int age) {
this.age = age;
}
//提供參數(shù)的提供者
@Provides
public int ageProvider() {
return age;
}
//提供對(duì)象的提供者
@Provides
public SellMoe sellMoeProvider(int age) {
return new SellMoe(age);
}
}
傳參的事情交給提供者來完成。
Step3:創(chuàng)建注入器(@Component)
帶參的注入器必須指定使用的模型:
//指定模型
@Component(modules = SellMoeModule.class)
public interface SellMoeComponent {
void inject(MainActivity mainActivity);
}
Step4:構(gòu)建項(xiàng)目,生成注入器
反正養(yǎng)成習(xí)慣寫完注入器就Build一次就對(duì)了!

Step5:注入對(duì)象
使用帶參模型注入的時(shí)候,就不能直接使用create()方法了,
和需要更改OkHttp3的參數(shù)時(shí),需要使用OkHttpClient.Builder()一個(gè)道理,
這里也要使用Builder()傳入帶參的Module:
public class MainActivity extends AppCompatActivity {
@Inject
SellMoe sellMoe;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView textView = findViewById(R.id.textView);
DaggerSellMoeComponent.builder().sellMoeModule(new SellMoeModule(80)).build().inject(this);
textView.setText(sellMoe.sellMoe());
}
}
以上就是帶參對(duì)象的注入過程。
但是話又說回來,有時(shí)候一個(gè)對(duì)象,有帶參和不帶參兩個(gè)構(gòu)建方法,這個(gè)時(shí)候怎么辦嘞?
· 家庭作業(yè)
用Dagger2注入一個(gè)帶參數(shù)的杠精類,分別使用普通模式和單例模式:
public class GangJing {
private int age;
public GangJing(int age) {
this.age = age;
}
public String gang() {
return "我特么" + age + "歲了抬起杠來依然是個(gè)扛把子";
}
}