在 CDI 中,您可以定义一个对象,该对象将为您提供某种类型的项目,使用:
@注入 实例myObjectInstance; //... MyObject myObjectInstance.get();
类似地,在 Guice 中你可以这样做:
@注入 提供者myObjectInstance; //... MyObject myObjectInstance.get();
我想知道 Spring 中是否有类似的构造,或者您必须使用
ApplicationContext
才能获取参考?
经过大量研究,我发现 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 回归问题)