当使用javax.inject.Provider在春天?(When to use javax.inj

2019-09-02 04:49发布

它所做的是非常简单的:

@Inject
private Provider<ProductService> productService;

该产品的服务可通过productService.get().get()将解决从每个呼叫的Spring上下文的实例。

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

我主要用例是非常简单的:当我得到循环依赖,供应商帮助解决在运行时的依赖。 但它看起来有点乱,如果你把它扔到只是当你不能创建造成循环依赖您的上下文。

是否有关于供应商的使用任何已知的模式?

Answer 1:

此接口是相当于org.springframework.beans.factory.ObjectFactory<T>是通常用于避免BeanFactory.getBean()寻找原型实例时在客户端的代码调用。 常见使用ObjectFactoryCreatingFactoryBean获得由源自原型豆BeanFactory

例如,从ObjectFactoryCreatingFactoryBean的javadocs:

<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代替。

(使用继承代替组合物),以解决同样的问题,另一种选择是在查找方法注射



Answer 2:

在CDI,提供程序用来注入更窄范围的物体插入具有更广泛范围的豆,例如,如果会话作用域的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();
    }
}

下面将使用的Bean的与当前呼叫Bean3.doSomething(),即不同的豆每个请求的特定请求相关联的实例:

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

    public void doSomething() {
        bean.get().doSomething();
    }
}


文章来源: When to use javax.inject.Provider in Spring?