一、注入方法不支持多態(tài)(必須指定具體的Activity)。
@Component(modules ={HttpModule.class, DatabaseModule.class})
public interface MyComponent {
/ /這里的參數(shù)是不能用多態(tài)
void injectMainActivity(MainActivity activity);
}
二、@Singleton 是dagger提供的作用于注解,一般在module里使用。并不是java中的單例對(duì)象,是指在同一個(gè)容器中的同一對(duì)象類,作用域跟裝載他的component生命周期一致。所以Activity無(wú)論實(shí)例化多少次,都是指向同一個(gè)地址。
public class SingletonActivity extends AppCompatActivity {
@Inject
StudentSingleton singleton1 ;
@Inject
StudentSingleton singleton2 ;
TextView tv;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_second);
tv = findViewById(R.id.id_tv_content);
//build之后 進(jìn)行對(duì)象注入
DaggerStudentSingleComponent.builder().build().inject(this);
}
public void getStudentInfo(View v) {
tv.setText(singleton1 + "\n" + singleton2);
}
}
可以看到結(jié)果兩個(gè)StudentSingleton對(duì)象指向的相同的地址,那么說(shuō)明它們是同一個(gè)對(duì)象。
但是在另外的Activity中,也生成一個(gè)StudentSingleton對(duì)象,輸出的地址跟上面的不同。
由此可見(jiàn),@Singleton注解并不是我們平常意義上的單例,只是在同一個(gè)容器中,指向同一個(gè)對(duì)象才可能被稱為單例。
如果想實(shí)現(xiàn)全局單例,那就在application創(chuàng)建dagger的component,然后Activity通過(guò)get拿到這個(gè)component對(duì)象。
常見(jiàn)面試題:@Singleton 如何實(shí)現(xiàn)單例?
原理:
1、Component 持有單例依賴實(shí)例。
2、同一 Component 多次注入返回相同對(duì)象。
三、 Dagger 2 在 Android 中的最佳實(shí)踐
配置:
Application 級(jí) Component 提供全局單例(如 Retrofit, Room)。
Activity 級(jí) Subcomponent 提供與界面相關(guān)的依賴(如 Presenter)。