什么时候在Spring中使用javax.inject.Provider?

什么是非常简单的:

@Inject private Provider productService; 

productService.get().get()可以通过每次调用从Spring上下文中解析实例。

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

我的主要用例非常简单:当我获得循环依赖时,提供程序有助于在运行时解决依赖关系。 但是如果你把它扔进去只是因为你不能创建由循环依赖引起的上下文,它看起来有点随机。

是否有关于提供商使用的已知模式?

此接口等同于org.springframework.beans.factory.ObjectFactory ,它通常用于在查找原型实例时避免客户端代码中的BeanFactory.getBean()调用。 通常与ObjectFactoryCreatingFactoryBean一起使用来获取BeanFactory原型bean。

ObjectFactoryCreatingFactoryBean javadocs中的示例:

           

使用Providers ,您可以使用ProviderCreatingFactoryBean

解决相同问题的其他选项(使用inheritance而不是组合)是查找方法注入

在cdi中,提供者用于将较小范围的对象注入较大的范围bean,例如。 如果会话范围bean需要访问请求范围对象,则它会注入提供程序,然后在请求中运行的方法调用provider.get()以获取对相应请求范围对象的本地变量引用。

鉴于以下内容:

 @RequestScoped public class Bean1 { void doSomething(); } 

以下将使用与会话中第一个请求关联的Bean1实例来使用Bean2,无论哪个请求正在调用Bean2.doSomething():

 @SessionScoped public class Bean2 { @Inject Bean1 bean; public void doSomething() { bean.doSomething(); } } 

以下将使用与当前调用Bean3.doSomething()的特定请求关联的Bean实例,即每个请求的不同bean:

 @SessionScoped public class Bean3 { @Inject Provider bean; public void doSomething() { bean.get().doSomething(); } }