在CDI中,您可以使用以下命令定义一个对象,该对象将为您提供特定类型的项目:
@Inject Instance<MyObject> myObjectInstance; //... MyObject myObjectInstance.get();
同样在Guice中你可以这样做:
@Inject Provider<MyObject> myObjectInstance; //... MyObject myObjectInstance.get();
我想知道Spring中是否有类似的构造,或者你必须使用ApplicationContext
才能获得引用?
答案 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