Dagger2 generates code to handle dependency injection behind the scenes. It creates classes like DaggerBreadShop to manage component bindings and factories like BreadModule_ProvideBreadFactory to retrieve dependencies. When a dependency is requested, it uses the factories to resolve the dependency by delegating to the corresponding module method, such as BreadModule::provideBread, which creates the actual instance. For singleton scopes, it caches the instance rather than creating a new one each time. When injecting dependencies into objects, it generates members injectors like Lunch_MembersInjector to set the dependencies directly.
14. @Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerBreadShop implements BreadShop {
private Provider<Bread> provideBreadProvider;
private DaggerBreadShop(Builder builder) {
assert builder != null;
initialize(builder);
}
public static Builder builder() {
return new Builder();
}
public static BreadShop create() {
return builder().build();
}
private void initialize(final Builder builder) {
this.provideBreadProvider = BreadModule_ProvideBreadFactory.create(builder.breadModule);
}
@Override
public Bread bread() {
return provideBreadProvider.get();
}
public static final class Builder {
private BreadModule breadModule;
private Builder() {
}
public BreadShop build() {
if (breadModule == null) {
this.breadModule = new BreadModule();
}
return new DaggerBreadShop(this);
}
public Builder breadModule(BreadModule breadModule) {
if (breadModule == null) {
throw new NullPointerException("breadModule");
}
this.breadModule = breadModule;
return this;
}
}
}
15. }
public static final class Builder {
private BreadModule breadModule;
private Builder() {
}
public BreadShop build() {
if (breadModule == null) {
this.breadModule = new BreadModule();
}
return new DaggerBreadShop(this);
}
public Builder breadModule(BreadModule breadModule) {
if (breadModule == null) {
throw new NullPointerException("breadModule");
}
this.breadModule = breadModule;
return this;
}
}
16. }
public static final class Builder {
private BreadModule breadModule;
private Builder() {
}
public BreadShop build() {
if (breadModule == null) {
this.breadModule = new BreadModule();
}
return new DaggerBreadShop(this);
}
public Builder breadModule(BreadModule breadModule) {
if (breadModule == null) {
throw new NullPointerException("breadModule");
}
this.breadModule = breadModule;
return this;
}
}
17. @Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerBreadShop implements BreadShop {
private Provider<Bread> provideBreadProvider;
private DaggerBreadShop(Builder builder) {
assert builder != null;
initialize(builder);
}
private void initialize(final Builder builder) {
this.provideBreadProvider =
BreadModule_ProvideBreadFactory.create(builder.breadModule);
}
@Override
public Bread bread() {
return provideBreadProvider.get();
}
public static final class Builder {
private BreadModule breadModule;
private Builder() {
18. @Generated("dagger.internal.codegen.ComponentProcessor")
public final class DaggerBreadShop implements BreadShop {
private Provider<Bread> provideBreadProvider;
private DaggerBreadShop(Builder builder) {
assert builder != null;
initialize(builder);
}
private void initialize(final Builder builder) {
this.provideBreadProvider =
BreadModule_ProvideBreadFactory.create(builder.breadModule);
}
@Override
public Bread bread() {
return provideBreadProvider.get();
}
public static final class Builder {
private BreadModule breadModule;
private Builder() {
19. @Generated("dagger.internal.codegen.ComponentProcessor")
public final class BreadModule_ProvideBreadFactory implements Factory<Bread> {
private final BreadModule module;
public BreadModule_ProvideBreadFactory(BreadModule module) {
assert module != null;
this.module = module;
}
@Override
public Bread get() {
Bread provided = module.provideBread();
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides m
}
return provided;
}
public static Factory<Bread> create(BreadModule module) {
return new BreadModule_ProvideBreadFactory(module);
}
}
20. @Generated("dagger.internal.codegen.ComponentProcessor")
public final class BreadModule_ProvideBreadFactory implements Factory<Bread> {
private final BreadModule module;
public BreadModule_ProvideBreadFactory(BreadModule module) {
assert module != null;
this.module = module;
}
@Override
public Bread get() {
Bread provided = module.provideBread();
if (provided == null) {
throw new NullPointerException("Cannot return null from a non-@Nullable @Provides m
}
return provided;
}
public static Factory<Bread> create(BreadModule module) {
return new BreadModule_ProvideBreadFactory(module);
}
}
34. public final class ScopedProvider<T> implements Provider<T> {
:
@Override
public T get() {
// double-check idiom from EJ2: Item 71
Object result = instance;
if (result == UNINITIALIZED) {
synchronized (this) {
result = instance;
if (result == UNINITIALIZED) {
instance = result = factory.get();
}
}
}
return (T) result;
}
:
}
51. @Generated("dagger.internal.codegen.ComponentProcessor")
public final class Lunch_MembersInjector implements MembersInjector<Lunch> {
private final Provider<Bread> breadProvider;
public Lunch_MembersInjector(Provider<Bread> breadProvider) {
assert breadProvider != null;
this.breadProvider = breadProvider;
}
@Override
public void injectMembers(Lunch instance) {
if (instance == null) {
throw new NullPointerException("Cannot inject members into a null reference
}
instance.bread = breadProvider.get();
}
public static MembersInjector<Lunch> create(Provider<Bread> breadProvider) {
return new Lunch_MembersInjector(breadProvider);
}
}
52. @Generated("dagger.internal.codegen.ComponentProcessor")
public final class Lunch_MembersInjector implements MembersInjector<Lunch> {
private final Provider<Bread> breadProvider;
public Lunch_MembersInjector(Provider<Bread> breadProvider) {
assert breadProvider != null;
this.breadProvider = breadProvider;
}
@Override
public void injectMembers(Lunch instance) {
if (instance == null) {
throw new NullPointerException("Cannot inject members into a null reference
}
instance.bread = breadProvider.get();
}
public static MembersInjector<Lunch> create(Provider<Bread> breadProvider) {
return new Lunch_MembersInjector(breadProvider);
}
}