Spring原型范围 - 用例?

时间:2012-03-12 09:49:44

标签: java spring prototype-scope

我清楚地了解了Spring bean的各种范围。但我正在寻找企业级项目中bean的原型范围的一些用例。如果您可以分享 prototype 范围(而不是请求范围)的一些实际用例,那就太棒了。

5 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:4)

我主要使用原型与spring lookup-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。

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

答案 2 :(得分:4)

作为之前曾在SpringSource工作的人,并就此主题与开发人员进行了交流。这是我的看法。 Prototype很适合测试,因此名称原型而不是createnew或者每次从Spring容器中请求时创建bean的新实例的更多描述。

多年来我也发现,在任何现实世界的生产应用中,原型都没有意义的任何其他地方。如果你的对象保持状态,它通常不应该是一个Spring bean。我发现在我所有的应用程序中,所有bean都是服务,存储库和Singleton非状态保持对象,我需要添加诸如Transactionality,JPA,JMS等功能,这些功能为我们提供了POJO所需的企业功能&# 39; t。。

我的系统中保存状态的对象可能是我的实体和视图DTO,或者其他只是没有意义的Spring Bean。因此,在我的生产应用中,还没有单一的原型和#34;豆。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

原型范围每次在应用程序代码对Bean的请求时都会创建一个新的Bean实例。

您应该知道,销毁bean生命周期方法不称为原型作用域bean,而仅调用初始化回调方法。因此,作为开发人员,您有责任清理原型范围内的Bean实例以及其中包含的所有资源。

原型Bean作用域的Java配置示例–

@Component

@Scope(“ prototype”)

列表项

公共类BeanClass { }