Package dagger

Annotation Type BindsInstance


  • @Documented
    @Retention(RUNTIME)
    @Target({METHOD,PARAMETER})
    @Beta
    public @interface BindsInstance
    Marks a method on a component builder or a parameter on a component factory as binding an instance to some key within the component.

    For example:

       @Component.Builder
       interface Builder {
         @BindsInstance Builder foo(Foo foo);
         @BindsInstance Builder bar(@Blue Bar bar);
         ...
       }
    
       // or
    
       @Component.Factory
       interface Factory {
         MyComponent newMyComponent(
             @BindsInstance Foo foo,
             @BindsInstance @Blue Bar bar);
       }
     

    will allow clients of the builder or factory to pass their own instances of Foo and Bar, and those instances can be injected within the component as Foo or @Blue Bar, respectively. It's important to note that unlike in factories, the methods in builders should only accept and bind a single parameter each. Using the following will result in an error:

       @Component.Builder
       interface Builder {
         // Error! Builder methods can only have one parameter
         @BindsInstance Builder fooAndBar(Foo foo, @Blue Bar bar);
         ...
       }
     

    @BindsInstance arguments may not be null unless the parameter is annotated with @Nullable.

    For builders, @BindsInstance methods must be called before building the component, unless their parameter is marked @Nullable, in which case the component will act as though it was called with a null argument. Primitives, of course, may not be marked @Nullable.

    Binding an instance is equivalent to passing an instance to a module constructor and providing that instance, but is often more efficient. When possible, binding object instances should be preferred to using module instances.