我对Spring bean的各种作用域有清楚的了解。但是我正在寻找企业级项目中bean原型作用域的一些用例。如果你能分享一些 prototype 作用域(而不是 request 作用域)的真实的用例,那就太好了。
zbdgwd5y1#
作为一个曾经在SpringSource工作过的人,我和开发人员讨论过这个主题。下面是我的看法。Prototype非常适合测试,因此命名为prototype,而不是create new,或者更多的描述是在每次从Spring容器请求bean时创建一个新的bean示例。在我多年的使用中,我还发现,我想不出在任何实际生产应用程序中原型有任何其他意义的地方。如果您的对象保存状态,它通常不应该是Springbean。我发现,在我工作过的所有应用程序中,所有bean都是服务、存储库和Singleton非状态保存对象,在这些对象中,我需要添加诸如Transactionality、JPA JMS等为我们提供了POJO所不具备的企业特性。我的系统中保存状态的对象可能是我的实体和视图DTO,或者是其他对Spring Bean没有意义的东西。因此,在我的生产应用程序中,没有一个“原型”Bean。
mctunoxg2#
我使用prototype bean来声明已配置的表单元素(一个文本框,被配置为验证姓名、电子邮件地址等),并为我的web应用程序中创建的每个表单获取它们的“活动”示例。细节并不重要,重要的是原则,我将以如下方式总结:
applicationContext.getBean("myBeanConfiguredFancy1")
mmvthczy3#
我使用的prototype主要是与spring lookup-method结合使用。
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。
pipeline.addLast("lengthDecoder", createLengthBasedFrameDecoder());
bean="lengthFieldBasedFrameDecoder"
prototype
**注意:**协议只是一组链接在一起的特定解码器和编码器。“责任链”设计模式。
qybjjes14#
我们可以在模型类(在Hibernate中也称为实体)情况下使用原型作用域,因为应用程序对于每个线程/请求都需要模型类的不同示例。
4条答案
按热度按时间zbdgwd5y1#
作为一个曾经在SpringSource工作过的人,我和开发人员讨论过这个主题。下面是我的看法。Prototype非常适合测试,因此命名为prototype,而不是create new,或者更多的描述是在每次从Spring容器请求bean时创建一个新的bean示例。
在我多年的使用中,我还发现,我想不出在任何实际生产应用程序中原型有任何其他意义的地方。如果您的对象保存状态,它通常不应该是Springbean。我发现,在我工作过的所有应用程序中,所有bean都是服务、存储库和Singleton非状态保存对象,在这些对象中,我需要添加诸如Transactionality、JPA JMS等为我们提供了POJO所不具备的企业特性。
我的系统中保存状态的对象可能是我的实体和视图DTO,或者是其他对Spring Bean没有意义的东西。因此,在我的生产应用程序中,没有一个“原型”Bean。
mctunoxg2#
我使用prototype bean来声明已配置的表单元素(一个文本框,被配置为验证姓名、电子邮件地址等),并为我的web应用程序中创建的每个表单获取它们的“活动”示例。细节并不重要,重要的是原则,我将以如下方式总结:
applicationContext.getBean("myBeanConfiguredFancy1")
视为一种工厂方法,它创建xml中预配置的示例mmvthczy3#
我使用的prototype主要是与spring
lookup-method
结合使用。在协议实现类中,我有以下代码来创建帧解码器
pipeline.addLast("lengthDecoder", createLengthBasedFrameDecoder());
。当调用此方法时,spring将创建一个新的帧解码器示例并返回它。bean="lengthFieldBasedFrameDecoder"
返回的bean需要在prototype
范围内,因为它是我的应用程序中的有状态bean。**注意:**协议只是一组链接在一起的特定解码器和编码器。“责任链”设计模式。
qybjjes14#
我们可以在模型类(在Hibernate中也称为实体)情况下使用原型作用域,因为应用程序对于每个线程/请求都需要模型类的不同示例。