何时在Spring中使用javax.inject.Provider?


问题内容

它的作用非常简单:

@Inject
private Provider<ProductService> productService;

产品服务可通过以下服务获得productService.get().get()并将在每次调用时从Spring上下文解析实例。

但是我什么时候应该使用它?在哪里

我的主要用例非常简单:当我获得循环依赖关系时,提供程序将在运行时帮助解决依赖关系。但是,如果只是在由于循环依赖而无法创建上下文的情况下将其丢弃,则它看起来有些随机。

关于提供者的使用是否存在任何已知模式?


问题答案:

该接口与寻找原型实例时org.springframework.beans.factory.ObjectFactory<T>通常用于避免BeanFactory.getBean()在客户端代码中调用的接口等效。通常用于ObjectFactoryCreatingFactoryBean获取由来源的Bean原型BeanFactory

来自ObjectFactoryCreatingFactoryBeanjavadocs的示例:

<beans>

   <!-- Prototype bean since we have state -->
   <bean id="myService" class="a.b.c.MyService" scope="prototype"/>

   <bean id="myServiceFactory"
       class="org.springframework.beans.factory.config.ObjectFactoryCreatingFactoryBean">
     <property name="targetBeanName"><idref local="myService"/></property>
   </bean>

   <bean id="clientBean" class="a.b.c.MyClientBean">
     <property name="myServiceFactory" ref="myServiceFactory"/>
   </bean>

</beans>

使用Providers,您可以ProviderCreatingFactoryBean改用。

解决相同问题的另一个选择(使用继承代替合成)是
查找方法注入