layout | title |
---|---|
article |
Annotated Field Injection |
This is where a component has an empty constructor with dependencies indicated by a field annotation and provided automatically by the container after instantiation.
public class Apple {
@Inject private Orange orange;
@Inject private Pear pear;
@Inject private Banana banana;
// methods
}
pico = new DefaultPicoContainer(new AnnotatedFieldInjection();
pico.addComponent(Apple.class); // etc
Apple apple = pico.getComponent(Apple.class);
With an custom annotation instead of PicoContainer's @Inject
pico = new DefaultPicoContainer(new AnnotatedFieldInjection(MyInjectAnnotaton.class);
pico.addComponent(Apple.class); // etc Apple apple = pico.getComponent(Apple.class);
Yes that's right, there's no constructor needed. It means that for a Unit Test, you cannot simply 'new' the class without some magic to populate the dependency fields.
The component factory for this is a class AnnotatedFieldInjection . It only handles annotation-field injection for components.
Additionally the default component factory AdaptiveInjection can also handle field annotation types, if the @Inject annotation from PicoContainer's code-base is used as the marker for injection. AdaptiveInjection will also fall through to constructor injection if there is no recognized `Inject annotation.