module
一個(gè)類(lèi)似工廠的類(lèi)。
@Module
public class ApplicationModule {
}
需要被包含到component中才能起作用。通過(guò)Component的modules屬性賦值。
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
void inject(MyApp app);
User user();
}
如上,我們需要在接口ApplicationComponent 中獲取到User,或者在MyApp中注入U(xiǎn)ser。
public class MyApp extends Application {
@Inject
User user;
@Override
public void onCreate() {
super.onCreate();
DaggerApplicationComponent.create().inject(this);
}
}
可以通過(guò)在User的構(gòu)造函數(shù)上標(biāo)注Inject實(shí)現(xiàn)。
public class User {
@Inject
public User(){
}
}
也可以通過(guò)在module的方法上標(biāo)注Providers實(shí)現(xiàn)。這種方式的優(yōu)先級(jí)高于inject標(biāo)注構(gòu)造函數(shù)的優(yōu)先級(jí)。
@Module
public class ApplicationModule {
@Provides
User user() {
return new User();
}
}
成功編譯后的Dagger類(lèi)。
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerApplicationComponent implements ApplicationComponent {
private Provider<User> userProvider;
private MembersInjector<MyApp> myAppMembersInjector;
private DaggerApplicationComponent(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
public static ApplicationComponent create() {
return builder().build();
}
private void initialize(final Builder builder) {
this.userProvider = ApplicationModule_UserFactory.create(builder.applicationModule);
this.myAppMembersInjector = MyApp_MembersInjector.create((MembersInjector) MembersInjectors.noOp(), userProvider);
}
@Override
public void inject(MyApp app) {
myAppMembersInjector.injectMembers(app);
}
@Override
public User user() {
return userProvider.get();
}
public static final class Builder {
private ApplicationModule applicationModule;
private Builder() {
}
public ApplicationComponent build() {
if (applicationModule == null) {
this.applicationModule = new ApplicationModule();
}
return new DaggerApplicationComponent(this);
}
public Builder applicationModule(ApplicationModule applicationModule) {
if (applicationModule == null) {
throw new NullPointerException("applicationModule");
}
this.applicationModule = applicationModule;
return this;
}
}
}
實(shí)質(zhì)是根據(jù)傳入的module創(chuàng)建了一個(gè)工廠類(lèi)。
@Generated("dagger.internal.codegen.ComponentProcessor")
public final class ApplicationModule_UserFactory implements Factory<User> {
private final ApplicationModule module;
public ApplicationModule_UserFactory(ApplicationModule module) {
assert module != null;
this.module = module;
}
@Override
public User get() {
User provided = module.user();
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides method");
}
return provided;
}
public static Factory<User> create(ApplicationModule module) {
return new ApplicationModule_UserFactory(module);
}
}
Component接口獲取的實(shí)例就是工廠類(lèi)的get方法返回的實(shí)例,工廠類(lèi)返回的實(shí)質(zhì)上是module里的方法返回的實(shí)例。注入的實(shí)例也是這樣來(lái)的。