2012-05-10 24 views
19

在CDI你可以定义一个对象,它会给你一个某种类型的物品,使用:什么是春天等效CDI的实例,或者Guices提供商

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

同样在吉斯,你可以这样做:

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

我想知道如果在春天有个类似的结构,或者必须以获得参考使用ApplicationContext

回答

15

很多周围挖我发现,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罐子 - 如果你使用Maven的,您可以:

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

Spring将检测到它,并从此刻起,你可以简单:

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

像在吉斯例子中,由于它是相同的API。

尽管我之前对Konstantin发表过评论,但Spring 确实创建了 Provider。 (我是测试它针对春季3.1.1和运行这个Spring Provider regression issue

+0

+1好答案。 –

+1

我担心提供程序<>和实例<>之间存在显着差异(希望我错了)。首先:实例实现Iterable,这对你如何使用它有很大的影响。例如。对我来说,经常使用的是声明@Inject Instance xxx ...所以我可以遍历每个实现无需知道类名的接口的类的实例。我想知道如何使用Provider来完成此操作。 – Rafael

+0

'Instance <>'不是JSR-330的一部分,也不是Spring的一部分。当时我遇到的问题是获取原型bean(取决于某些上下文变量),而没有掌握applicationContext本身。 –

2

听起来像一个FactoryBean

+0

不是真的。为了自动装配一个'FactoryBean',你需要一个实际的实现。从我可以告诉我应该使用'ObjectFactoryCreatingFactoryBean',但它听起来像太多的工作,没有很好的理由。 –

+0

那么scope =“prototype”的查找方法呢?就像这样:http://stackoverflow.com/a/10358248/1385087 –

+0

的问题是,它看起来像我必须改变XML(我尝试做了我的大部分豆通过注释)每一个“提供者”的实例。我注意到Spring支持JSR-330,因此也是Provider接口,不同之处在于它不会即时创建这些bean,您需要自行创建这些bean--因此它完全忽略了这一点。 而且没有查找法注解,所以我必须改变XML和创建新的类,每因素豆? –

相关问题