web-dev-qa-db-ja.com

アノテーションを使用してSpringLookupメソッドの注入を行う方法は?

アノテーションを使用してルックアップメソッドインジェクションを使用する方法はありますか?

次のクラスがあるとします。

@Service
public abstract class A {


    protected abstract createB();

}

それを機能させるには、SpringapplicationContext.xmlで次のように宣言する必要があります。

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

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

<context:component-scan base>を使用していますが、XMLでも宣言する必要があります。良いアプローチではないと思います。

アノテーションでそれを行う方法は?

30
Alfredo Osorio

javax.inject.Providerを使用することができます。すべての感謝は Phil Webb に行きます。

public class MySingleton {

  @Autowired
  private Provider<MyPrototype> myPrototype;

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

}
28
Andrej Herich

Spring APIについていく場合は、org.springframework.beans.factory.ObjectFactoryでも可能です。

public class MySingleton {

  @Autowired
  private ObjectFactory<MyPrototype> myPrototypeFactory;

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

詳細については、 ドキュメント をご覧ください。

17
Sami Andoni

Spring> = 4.1でのみ実装されます ticket を参照してください。

13
Bence Olah

最後に @ Lookup アノテーションとして導入されました。使い方は discussion です。

10
Danny Dan