Spring原型范围-用例?

hl0ma9xz  于 2022-10-30  发布在  Spring
关注(0)|答案(4)|浏览(170)

我对Spring bean的各种作用域有清楚的了解。但是我正在寻找企业级项目中bean原型作用域的一些用例。如果你能分享一些 prototype 作用域(而不是 request 作用域)的真实的用例,那就太好了。

zbdgwd5y

zbdgwd5y1#

作为一个曾经在SpringSource工作过的人,我和开发人员讨论过这个主题。下面是我的看法。Prototype非常适合测试,因此命名为prototype,而不是create new,或者更多的描述是在每次从Spring容器请求bean时创建一个新的bean示例。
在我多年的使用中,我还发现,我想不出在任何实际生产应用程序中原型有任何其他意义的地方。如果您的对象保存状态,它通常不应该是Springbean。我发现,在我工作过的所有应用程序中,所有bean都是服务、存储库和Singleton非状态保存对象,在这些对象中,我需要添加诸如Transactionality、JPA JMS等为我们提供了POJO所不具备的企业特性。
我的系统中保存状态的对象可能是我的实体和视图DTO,或者是其他对Spring Bean没有意义的东西。因此,在我的生产应用程序中,没有一个“原型”Bean。

mctunoxg

mctunoxg2#

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

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

mmvthczy3#

我使用的prototype主要是与spring lookup-method结合使用。

<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。

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

qybjjes1

qybjjes14#

我们可以在模型类(在Hibernate中也称为实体)情况下使用原型作用域,因为应用程序对于每个线程/请求都需要模型类的不同示例。

相关问题