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

Tar*_*ion 22 java provider spring dependency-injection

它的作用非常简单:

@Inject
private Provider<ProductService> productService;
Run Code Online (Sandbox Code Playgroud)

Product服务可通过productService.get().get()在每次调用时从Spring上下文中解析实例.

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

我的主要用例非常简单:当我获得循环依赖时,提供程序有助于在运行时解决依赖关系.但是当你无法创建由循环依赖引起的上下文时,它会看起来有点随机.

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

小智 26

在cdi中,提供者习惯于将范围较窄的对象注入到更广泛的bean中,例如,如果会话范围的bean需要访问请求范围对象,它会注入提供者,然后是在请求中运行的方法,调用provider.get()以获取对适当的请求范围对象的局部变量引用.

鉴于以下内容:

@RequestScoped
public class Bean1 {
    void doSomething();
}
Run Code Online (Sandbox Code Playgroud)

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

@SessionScoped
public class Bean2 {
    @Inject Bean1 bean;

    public void doSomething() {
        bean.doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

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

@SessionScoped
public class Bean3 {
    @Inject Provider<Bean1> bean;

    public void doSomething() {
        bean.get().doSomething();
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 另外,它可以让您延迟加载注入的bean. (3认同)
  • 如果您通过在其中注入一些代码来支持您的答案,那总是好的。这样就很容易理解了。 (2认同)

Jos*_*tin 21

此接口等效于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>
Run Code Online (Sandbox Code Playgroud)

有了Providers,您可以使用ProviderCreatingFactoryBean.

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