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

bog*_*ata 19 java spring guice cdi

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

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

同样在Guice中你可以做到:

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

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

bog*_*ata 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>
Run Code Online (Sandbox Code Playgroud)

Spring会检测到它,从那一刻起你可以简单地:

@Inject
Provider<MyObject> myObjectInstance;
//...
MyObject myObjectInstance.get();
Run Code Online (Sandbox Code Playgroud)

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

尽管我之前对Konstantin发表了评论,但Spring 确实创建了Provider.(我是针对Spring 3.1.1测试它并遇到这个Spring Provider回归问题)