(Two) Dagger2 @Inject analysis two

Code example
class Food {
    
    
    // @Inject:该注解用于类构造方法上表示该类可以被Dagger2实例化对象后供注射器使用.
    @Inject
    public Food() {
    
    
    }
}
class Tiger {
    
    
    // 假如老虎需要食物
    Food food;
    // @Inject:该注解用于类构造方法上表示该类可以被Dagger2实例化对象后供注射器使用.
    @Inject
    public Tiger(Food food) {
    
    
        this.food = food;
    }
    public void sleep() {
    
    
        System.out.println("Tiger sleeping");
    }
}
// 对象使用者
public class Zoo {
    
    
    // @Inject: 该注解用于成员变量上代表注射器可以为该成员变量赋值对象.
    @Inject
    Tiger tiger;
    @Test
    public void 案例二() {
    
    
        DaggerZooComponent.create().inject(this);
        tiger.sleep();
    }
}
// 注射器
// @Component: 该注解是用来创造对象提供方和对象使用间的桥梁,如何将对象赋值给成员变量都是由它来做的.
@Component
interface ZooComponent {
    
    
    Zoo inject(Zoo zoo);
}
Dagger2 generated code reading

The main analysis is to add different objects with dependencies to the syringe, and the syringe will automatically handle these dependencies according to the needs of the target user.

Looking at the code generated by Degger2 based on the above case, the generated code is in the build\generated\sources\annotationProcessor\..folder.

  1. DaggerZooComponent.create()
    create()Used to generate DaggerZooComponentobjects, DaggerZooComponentthe parent class is the ZooComponentinterface, which overrides the inject()methods in the interface .
final class DaggerZooComponent implements ZooComponent {
    
    
    private DaggerZooComponent() {
    
    
    }
    // create()方法创建DaggerZooComponent对象
    public static ZooComponent create() {
    
    
        return new Builder().build();
    }
    static final class Builder {
    
    
        private Builder() {
    
    
        }
        // 创建DaggerZooComponent对象
        public ZooComponent build() {
    
    
          return new DaggerZooComponent();
        }
    }                       
}
  1. .inject(this)Object injection
    Use the DaggerZooComponentobject to inject the object created by the syringe Tigerinto Zooit.
final class DaggerZooComponent implements ZooComponent {
    
    
    // 接口中的方法,由DaggerZooComponent实现,该方法就是用来向Zoo对象中注入Tiger对象的.
    @Override
    public Zoo inject(Zoo zoo) {
    
    
        // zoo就是inject(this)中的this了,代表Zoo对象.
        return injectZoo(zoo);
    }
    private Zoo injectZoo(Zoo instance) {
    
    
        // getTiger() 获取Tiger对象
        // instance: 就是.inject(this)中的this Zoo对象.
        Zoo_MembersInjector.injectTiger(instance, getTiger());
        return instance;
    }
    // Tiger与Food构造都标注了@Inject注解,他们之间存在依赖关系,这种依赖关系最终由注射器处理.
    private Tiger getTiger() {
    
    
      return new Tiger(new Food());
    }
}
  1. Zoo_MembersInjector.injectTiger(instance, getTiger());
    The final assignment action is done by the injectTiger()method.
public final class Zoo_MembersInjector implements MembersInjector<Zoo> {
    
    
    @InjectedFieldSignature("com.yey.dagger2.Zoo.tiger")
    public static void injectTiger(Zoo instance, Object tiger) {
    
    
      // instance.tiger: 为Zoo中字段tiger
      // tiger: 为上一步方法DaggerZooComponent.getTiger()创建的Tigerd对象.
      instance.tiger = (Tiger) tiger;
    }
}

Guess you like

Origin blog.csdn.net/MoLiao2046/article/details/106884489