当前位置: 首页 > 面试题库 >

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

朱鹏
2023-03-14
问题内容

它的作用非常简单:

@Inject
private Provider<ProductService> productService;

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

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

我的主要用例非常简单:当我获得循环依赖关系时,提供程序将在运行时帮助解决依赖关系。但是,如果只是在由于循环依赖而无法创建上下文的情况下将其丢弃,则它看起来有些随机。

关于提供者的使用是否存在任何已知模式?


问题答案:

该接口与寻找原型实例时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>

使用Providers,您可以ProviderCreatingFactoryBean改用。

解决相同问题的另一个选择(使用继承代替合成)是
查找方法注入



 类似资料:
  • 问题内容: 我正在阅读Pro Spring3这本书。它有一段确实让我感到困惑。该段是关于春季自动装配的。这是节选: 在大多数情况下,是否应该使用自动装配的问题的答案肯定是“不!”。自动装配可以在小型应用程序中节省时间,但在许多情况下,这会导致不良做法,并且在大型应用程序中不灵活。使用byName似乎是个好主意,但它可能会导致您为类提供人为的属性名称,以便可以利用自动装配功能。Spring的整个想法

  • 我们将mysql与hibernate4一起用于我们的一个应用程序。我们正在数据库中存储一些错误消息。下面是用于以DB存储当前时间的类属性。 现在,我们试图将这些数据存储在Neo4J graph DB和mysql DB中。我们也不想改变这个类当前的行为。 当我试图将此对象保存在Neo4J DB中时,它会抛出异常,如下所示: 原因:java.lang.IllegalArgumentException:

  • 我有一个非常基本的Spring Security设置使用session。我的问题是,我找不到使用任何类型的会话侦听器(Spring和Servlet API版本)来侦听SessionCreated事件的方法。登录正在工作,会话正在正确创建。 首先,我尝试了最基本的会话监听器: 我也试过这里的答案,也不起作用

  • 问题内容: 我是pthread的新手,我正试图了解它。我看到了一些类似以下的示例。 我可以看到API阻止了它,并且我看到了一些示例,其中主要功能都被API阻止了。我不明白什么时候使用什么? 我指的是以下站点-https://computing.llnl.gov/tutorials/pthreads/。我无法获得何时使用和何时使用的概念。 有人可以解释一下吗?此外,将感谢一个很好的pthread教程

  • 我有一个Employee类,它有如下3个字段。 为此,我希望根据员工姓名(empName)排序,如果多个员工的姓名相同,则根据员工id(empId)排序。 为此,我编写了一个自定义比较器,使用java.util.比较器如下所示。 我已经创建了8个Employee对象并添加到ArrayList中,如下所示。 并使用上述比较器对列表进行如下排序。 它工作得非常好。但这可以使用类似的方法来完成,如下所示

  • 我正在为rest控制器编写junits。我只希望加载与控制器相关的最小上下文,我认为这就是加载上下文的方式。但是junit正在加载完整的Spring上下文,它失败了,因为一些bean无法创建。 我已经搜索并阅读了许多关于stackoverflow的问题,没有一个解决方案能够排除特定的配置。在为控制器编写junits时,如何加载最小的上下文?或者有没有办法排除一些配置类?我使用的是Spring bo