首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >什么时候在Spring中使用javax.inject.Provider?

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

Stack Overflow用户
提问于 2013-05-08 15:34:30
回答 2查看 45.4K关注 0票数 32

它的作用非常简单:

代码语言:javascript
复制
@Inject
private Provider<ProductService> productService;

产品服务可通过productService.get()获得,.get()将在每次调用时从Spring解析实例。

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

我的主要用例非常简单:当我获得循环依赖时,提供者帮助在运行时解析依赖。但是如果你在循环依赖导致你不能创建你的上下文的时候加入它,它看起来有点随机。

关于提供者的使用有什么已知的模式吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-05-08 16:43:50

此接口相当于org.springframework.beans.factory.ObjectFactory<T>,通常用于在查找原型实例时避免在客户端代码中调用BeanFactory.getBean()。通常与ObjectFactoryCreatingFactoryBean一起使用,以获取由BeanFactory提供的原型bean。

来自ObjectFactoryCreatingFactoryBean javadoc的示例:

代码语言:javascript
复制
<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

票数 23
EN

Stack Overflow用户

发布于 2015-03-28 09:13:56

在cdi中,提供者用于将较窄作用域的对象注入到较宽作用域的bean中,例如,如果会话作用域的bean需要访问请求作用域的对象,则它会注入提供者,然后在请求中运行的方法调用provider.get()来获得对适当的请求作用域对象的局部变量引用。

假设有以下情况:

代码语言:javascript
复制
@RequestScoped
public class Bean1 {
    void doSomething();
}

下面将使用与会话中的第一个请求相关联的Bean1实例来使用Bean2,而不管哪个请求正在调用Bean2.doSomething():

代码语言:javascript
复制
@SessionScoped
public class Bean2 {
    @Inject Bean1 bean;

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

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

代码语言:javascript
复制
@SessionScoped
public class Bean3 {
    @Inject Provider<Bean1> bean;

    public void doSomething() {
        bean.get().doSomething();
    }
}
票数 35
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16435117

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档