【问题标题】:Spring prototype scope - Use Cases?Spring原型范围 - 用例?
【发布时间】:2012-03-28 17:15:39
【问题描述】:

我对 Spring bean 的各种作用域有清晰的认识。但我正在寻找企业层项目中 bean 原型范围的一些用例。如果您可以分享一些 prototype 范围(而不是 request 范围)的现实生活用例,那就太好了。

【问题讨论】:

  • 我很惊讶这个没有代码的简短问题,没有被标记为不具建设性,太宽泛。别误会,我觉得这个问题很好

标签: java spring prototype-scope


【解决方案1】:

作为以前在 SpringSource 工作并就该主题与开发人员进行过交谈的人。这是我的看法。 Prototype 非常适合测试事物,因此命名原型而不是 createnew 或更多描述每次从 Spring 容器请求它时创建 bean 的新实例。

多年来,我在使用过程中还发现,在任何其他地方,原型在任何现实世界的生产应用程序中都是有意义的。如果您的对象保持状态,它通常不应该是 Spring bean。我发现在我处理过的所有应用程序中,所有 bean 都是服务、存储库和 Singleton 非状态持有对象,我需要在其中添加诸如事务性、JPA、JMS 之类的特性,这些特性为我们提供 POJO 所没有的企业特性'没有。

我的系统中保持状态的对象可能是我的实体和视图 DTO,或者其他对于成为 Spring Bean 毫无意义的东西。因此,在我的生产应用程序中,没有一个“原型”bean。

【讨论】:

    【解决方案2】:

    我使用原型 bean 来声明已配置的表单元素(例如配置为验证姓名、电子邮件地址的文本框),并为在我的 web 应用程序中创建的每个表单获取它们的“活动”实例。细节不重要,重要的是原则,我会这样总结:

    • 有一个类有很多配置参数
    • 您需要使用一组预定义的配置(fancy1、fancy2、stc)创建它的实例
    • applicationContext.getBean("myBeanConfiguredFancy1") 视为一种工厂方法,它按照xml 中的预配置创建实例

    【讨论】:

      【解决方案3】:

      我主要将原型与 springlookup-method 结合使用。我的应用程序是一个game server,它需要在 tcp 端口解码传入的字节。考虑以下 bean 定义

      <bean id="channelBufferProtocol" class="org.menacheri.protocols.impl.ChannelBufferProtocol">
          <lookup-method name="createLengthBasedFrameDecoder" bean="lengthFieldBasedFrameDecoder"/>
          <property name="eventDecoder" ref="eventDecoder"></property>
          <property name="lengthFieldPrepender" ref="lengthFieldPrepender"></property>
          <property name="eventEncoder" ref="eventEncoder"></property>
      </bean>
      

      在协议实现类里面,我有如下代码来创建帧解码器pipeline.addLast("lengthDecoder", createLengthBasedFrameDecoder());当这个方法被调用时,spring会创建一个新的帧解码器实例并返回。

      bean="lengthFieldBasedFrameDecoder" 返回的 bean 需要在 prototype 范围内,因为它是我的应用程序中的有状态 bean。

      注意:协议只不过是一组链接在一起的特定解码器和编码器。 “责任链”设计模式。

      【讨论】:

      【解决方案4】:

      我们可以在模型类(在休眠中也称为实体)的情况下使用原型范围,因为应用程序需要为每个线程/请求提供不同的模型类实例。

      【讨论】:

      • 那不应该是请求范围而不是原型范围吗?
      • 一个请求可以有同一个实体的多个实例。
      猜你喜欢
      • 1970-01-01
      • 2013-06-14
      • 2013-02-09
      • 2011-09-22
      • 2011-05-06
      • 2015-06-19
      • 2020-02-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多