Overview

This is where a component has an empty constructor and gets its dependencies injected into annotated methods after instantiation:

public class Apple {
    private Orange orange;
    private Pear pear;
    private Banana banana;

    @Inject
    public injectOrange(Orange orange) {
        this.orange = orange;
    }

    @Inject
    public setPear(Pear pear) {
        this.pear = pear;
    }

    @Inject
    public provideBanana(Banana banana) {
        this.banana = banana;
    }

    // other methods
}

Usage

pico = new DefaultPicoContainer(new AnnotatedMethodInjection();
pico.addComponent(Apple.class);
// etc
Apple apple = pico.getComponent(Apple.class);

With an custom annotation instead of PicoContainer's @Inject

pico = new DefaultPicoContainer(new AnnotatedMethodInjection(MyInjectAnnotaton.class);
pico.addComponent(Apple.class);
// etc
Apple apple = pico.getComponent(Apple.class);

The method (whatever its name) needs an @Inject annotation. That is from our codebase (org.picocontainer.Inject).

The component factory for this is AnnotatedMethodInjection. It only handles method-annotation injection types of components.

Additionally the default component factory AdaptiveInjection can also handle method-annotation injection 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 annotation.