它的作用非常简单:
@Inject
private Provider<ProductService> productService;
产品服务可通过productService.get()
获得,.get()
将在每次调用时从Spring解析实例。
但是我应该在什么时候使用它呢?在哪里呢?
我的主要用例非常简单:当我获得循环依赖时,提供者帮助在运行时解析依赖。但是如果你在循环依赖导致你不能创建你的上下文的时候加入它,它看起来有点随机。
关于提供者的使用有什么已知的模式吗?
发布于 2013-05-08 16:43:50
此接口相当于org.springframework.beans.factory.ObjectFactory<T>
,通常用于在查找原型实例时避免在客户端代码中调用BeanFactory.getBean()
。通常与ObjectFactoryCreatingFactoryBean
一起使用,以获取由BeanFactory
提供的原型bean。
来自ObjectFactoryCreatingFactoryBean
javadoc的示例:
<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
。
解决相同问题的另一个选择(使用继承而不是组合)是lookup method injection
发布于 2015-03-28 09:13:56
在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<Bean1> bean;
public void doSomething() {
bean.get().doSomething();
}
}
https://stackoverflow.com/questions/16435117
复制相似问题