Usage in dependent components
In the context of a hierarchy of dependent components, such as in this example, provision methods such as Foo foo()
are for exposing bindings to a dependent component. "Expose" means "make available" or even "publish". Note that the name of the method itself is actually irrelevant. Some programmers choose to name these methods Foo exposeFoo()
to make the method name reflect its purpose.
Explanation:
When you write a component in Dagger 2, you group together modules containing @Provides
methods. These @Provides
methods can be thought of as "bindings" in that they associate an abstraction (e.g., a type) with a concrete way of resolving that type. With that in mind, the Foo foo()
methods make the Component able to expose its binding for Foo
to dependent components.
Example:
Let's say Foo
is an application Singleton and we want to use it as a dependency for instances of DependsOnFoo
but inside a component with narrower scope. If we write a naive @Provides
method inside one of the modules of MyDependentComponent
then we will get a new instance. Instead, we can write this:
@PerFragment
@Component(dependencies = {MyComponent.class }
modules = { MyDependentModule.class })
public class MyDependentComponent {
void inject(MyFragment frag);
}
And the module:
@Module
public class MyDepedentModule {
@Provides
@PerFragment
DependsOnFoo dependsOnFoo(Foo foo) {
return new DependsOnFoo(foo);
}
}
Assume also that the injection site for DependentComponent
contains DependsOnFoo
:
public class MyFragment extends Fragment {
@Inject DependsOnFoo dependsOnFoo
}
Note that MyDependentComponent
only knows about the module MyDependentModule
. Through that module, it knows it can provide DependsOnFoo
using an instance of Foo
, but it doesn't know how to provide Foo
by itself. This happens despite MyDependentComponent
being a dependent component of MyComponent
. The Foo foo()
method in MyComponent
allows the dependent component MyDependentComponent
to use MyComponent
's binding for Foo
to inject DependsOnFoo
. Without this Foo foo()
method, the compilation will fail.
Usage to resolve a binding
Let's say we would like to obtain instances of Foo
without having to call inject(this)
. The Foo foo()
method inside the component will allow this much the same way you can call getInstance()
with Guice's Injector
or Castle Windsor's Resolve
. The illustration is as below:
public void fooConsumer() {
DaggerMyComponent component = DaggerMyComponent.builder.build();
Foo foo = component.foo();
}
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…