它所做的是非常简单的:
@Inject
private Provider<ProductService> productService;
该产品的服务可通过productService.get()
和.get()
将解决从每个呼叫的Spring上下文的实例。
但是,什么时候应该使用它? 在哪里?
我主要用例是非常简单的:当我得到循环依赖,供应商帮助解决在运行时的依赖。 但它看起来有点乱,如果你把它扔到只是当你不能创建造成循环依赖您的上下文。
是否有关于供应商的使用任何已知的模式?
此接口是相当于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
代替。
(使用继承代替组合物),以解决同样的问题,另一种选择是在查找方法注射
在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();
}
}