小假期就要结束了,也是浪了三天啊,明天又要开始工作了,今天晚上好好休息调整下状态,准备把在外流浪的心给收回来,该玩的时候好好玩,该工作学习的时候要及时调整好状态了。
一般我们用Dagger2 的时候,都是在Application中生成一个AppComponent,然后其他的功能模块的Component依赖于AppComponent,但是我们使用的方式可能会有所不同,在BeggarComponent上有时会用@Component(modules = BeggarModule.class, dependencies = AppComponent.class)
,也有使用@Subcomponent(modules = BeggarModule.class)
方式提供Component,为了更好的理解Component和SubComponent,这里假设AppComponent是有权有势的地主,BeggarComponent比如为需要食物和住宿的流浪者,结合代码进行理解,代码如下:
一、Module模块
- AppModule.java
@Module public class AppModule { //地主的后勤部门 @Provides public Food provideFood() { //后勤提供食物 return new Food(); } @Provides public Accommodation provideAccommodation() { //后勤提供住宿 return new Accommodation(); } @Provides public Salary provideSalary() { //提供工钱 return new Salary(); } }
- BeggarModule.java
@Module public class BeggarModule { @Provides public Employee provideEmployee(Food food, Accommodation accommodation) { // Employee 依赖 food、accommodation return new Employee(food, accommodation); } }
- 此处的Food、Accommodation、Salary、Employee就是普通的实体类。
二、@Component 方式
- AppComponent.java
@Component(modules = AppModule.class) public interface AppComponent { //将AppModule中的Food、Accommodation暴露出来,以便于其他依赖于AppComponent的Component调用,也就是让后勤部门把食物和住宿提供出来 Food getFood(); Accommodation getAccommodation(); }
- BeggarComponent.java
@Component(modules = BeggarModule.class, dependencies = AppComponent.class) public interface BeggarComponent { void inject(Mansion mansion); //去刘府报名去 }
- 使用方法:
public class Mansion { @Inject Food food; @Inject Accommodation accommodation; @Inject Employee employee; //无法编译通过,因为Salary 在AppComponent 中没有显示的,也就是说虽然财务部门准备了工钱,可是地主没说要提供出去,也就是在AppComponent没把工钱暴露出去 //@Inject //Salary salary; public static void main(String[] args) { AppModule appModule = new AppModule(); AppComponent appComponent = DaggerAppComponent.builder() .AppModule(appModule) .build(); BeggarModule beggarModule = new BeggarModule(); BeggarComponent beggarComponent = DaggerBeggarComponent.builder() .appComponent(appComponent) .beggarModule(beggarModule) .inject(this); System.out.println("food is -->" + food); System.out.println("accommodation is -->" + accommodation); System.out.println("employee is -->" + employee); } }
- 注意:
依赖Component(BeggarComponent) 仅继承 被依赖Component(AppComponent) 中显示提供的依赖,如果不提供,则无法使用@Inject注入被依赖的Component(AppComponent)中的对象,即地主没有提供工钱,估无法通过使用@Inject注入工钱对象。这种方法整体意思就是说地主发布通知说提供食物和住宿来招聘工人,乞丐看到后,愿意去到府内工作。
三、@SubComponent
- AppComponent.java
@Component(modules = AppModule.class) public interface AppComponent { //需要将SubComponent 追加到 被依赖的Component中,即把乞丐招进府内做工 BeggarComponent addEmployee(BeggarModule beggarModule); }
- BeggarComponent.java
@Subcomponent(modules = BeggarModule.class) public interface BeggarComponent { //乞丐举牌说谁给食物和住宿就可以到谁府上务工 void inject(Mansion mansion); }
- 使用方法:
public class Mansion { @Inject Food food; @Inject Accommodation accommodation; @Inject Employee employee; //可以直接注入,不会报错,也就是说财务部门给府内正式员工准备了工钱,所以可以拿到 //@Inject //Salary salary; public static void main(String[] args) { AppModule appModule = new AppModule(); BeggarModule beggarModule = new BeggarModule(); AppComponent appComponent = DaggerAppComponent.builder() .appModule(appModule) .build(); BeggarComponent beggarComponent = appComponent.addEmployee(beggarModule).inject(this); } }
- 注意:
此种方式可以理解为:乞丐举牌说谁给食物和住宿就给谁府上打工,此时地主看到后只需addEmployee即可把该乞丐招入府中为正式员工,府内的后勤部除了给与员工除食物和住宿外,还给予了工钱,爽歪歪啊。
四、Component dependencies和Subcomponent区别
Component dependencies 能单独使用,而Subcomponent必须由Component调用方法获取。
Component dependencies 可以很清楚的得知他依赖哪个Component, 而Subcomponent不知道它自己的谁的孩子……真可怜
使用上的区别,Subcomponent就像这样
DaggerAppComponent.builder() .appModule(appModule) .build() .addEmployee(beggarModule) .inject(this)
使用dependencies可能是这样
DaggerBeggarComponent.builder() .appComponent(appComponent) .beggarModule(beggarModule) .inject(this);
以上就是我对@Component的dependencies 和@SubComponent区别的理解,如若有疑问或者错误之处,希望给予指正。