什么是CDI的实例或Guices Provider的Spring等价物

时间:2012-05-10 16:35:58

标签: java spring guice cdi

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

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

同样在Guice中你可以这样做:

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

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

2 个答案:

答案 0 :(得分:15)

因此经过大量挖掘后我发现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 确实创建了提供者。 (我正在针对Spring 3.1.1测试它并遇到这个Spring Provider regression issue

答案 1 :(得分:2)

听起来像FactoryBean