21

在 CDI 中,您可以定义一个对象,该对象将为您提供特定类型的项目,使用:

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

同样在 Guice 你可以这样做:

@注入
提供者<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();

我想知道 Spring 中是否有类似的构造,或者您必须使用ApplicationContext才能获得参考?

4

2 回答 2

16

因此,经过大量挖掘后,我发现 Spring 支持 JSR-330。这个 JSR 定义了一个简单的 API——整个规范实际上就是这个 API——标准化了几个依赖注入接口、注释和行为。

与 Spring 不同FactoryBean,该javax.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();

就像在 Guice 示例中一样,因为它是相同的 API。

尽管我之前对 Konstantin 发表过评论,但 Spring确实自己创建了 Provider。(我正在针对 Spring 3.1.1 对其进行测试并遇到这个Spring Provider 回归问题

于 2012-05-11T08:48:56.703 回答
2

听起来像一个FactoryBean

于 2012-05-10T16:43:47.893 回答