30

Is there any way to use Lookup Method Injection using annotations?

Given the following class:

@Service
public abstract class A {


    protected abstract createB();

}

In order to get it to work I have to declare in spring applicationContext.xml the following:

<bean id="b" class="com.xyz.B">
</bean>

<bean id="a" class="com.xyz.A">
    <lookup-method name="createB" bean="b"/>
</bean>

Even though I am using <context:component-scan base> I have to declare it also in the XML. Not a good approach I think.

How to do it with annotations?

Alfredo Osorio
  • 11,297
  • 12
  • 56
  • 84

4 Answers4

29

It is possible to use javax.inject.Provider. All thanks go to Phil Webb.

public class MySingleton {

  @Autowired
  private Provider<MyPrototype> myPrototype;

  public void operation() {
    MyPrototype instance = myPrototype.get();
    // do something with the instance
  }

}
Andrej Herich
  • 3,246
  • 27
  • 14
  • 1
    Please also note the answer about @Lookup below - it's possible with Spring 4.1 ot later to use the annotation. Even though I think the Provider is much cleaner and less confusing while reading the code. – Tarion Sep 25 '15 at 08:35
17

It is also possible with org.springframework.beans.factory.ObjectFactory if you want to keep up with Spring API

public class MySingleton {

  @Autowired
  private ObjectFactory<MyPrototype> myPrototypeFactory;

  public void operation() {
    MyPrototype instance = myPrototypeFactory.getObject();
    // do something with the instance
  }
}

you can read more in the documentation.

Sami Andoni
  • 694
  • 6
  • 7
13

It is implemented only with Spring >= 4.1 See the ticket.

Bence Olah
  • 644
  • 6
  • 10
10

Finally introduced as @Lookup annotation. Here is discussion on how to use it.

Community
  • 1
  • 1
Danny Dan
  • 1,215
  • 1
  • 16
  • 32