21

CDI では、次を使用して、特定のタイプのアイテムを提供するオブジェクトを定義できます。

@注入
インスタンス<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();

同様に、Guice では次のことができます。

@注入
Provider<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();

ApplicationContextSpring に同様の構造があるのか​​、それとも参照を取得するために を使用する必要があるのか​​疑問に思っています。

4

2 に答える 2

16

そのため、いろいろ調べた結果、Spring が JSR-330 をサポートしていることがわかりました。この JSR は単純な API を定義します (仕様全体は文字通りこの API だけです)。これにより、いくつかの依存性注入インターフェイス、注釈、および動作が標準化されます。

Spring とは異なりFactoryBeanjavax.inject.Providerインターフェイスは Bean 参照の取得時に例外をスローしません。さらに、この FactoryBean をどこかで定義する必要があります (XML または@Configurationクラスを読み取ります。これは最適ではありません)。

バグのため、現在の Spring 3.1.1 ではjavax.inject.Provider 動作しません。Spring 3.1.0では機能します。

それを使用するには、単純に含める必要がありjavax.inject jarます-mavenを使用する場合、次のことができます:

    <dependency>
        <groupId>javax.inject</groupId>
        <artifactId>javax.inject</artifactId>
        <version>1</version>
    </dependency>

Spring がそれを検出し、その瞬間から簡単に次のことができます。

@Inject
Provider<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();

同じ API であるため、Guice の例と同様です。

Konstantin への以前のコメントにもかかわらず、Springはそれ自体で Provider を作成します。(私はSpring 3.1.1に対してテストしていて、このSpring Providerの回帰問題に遭遇しました)

于 2012-05-11T08:48:56.703 に答える
2

FactoryBeanのように聞こえます

于 2012-05-10T16:43:47.893 に答える