我清楚地了解了Spring bean的各种范围。但我正在寻找企业级项目中bean的原型范围的一些用例。如果您可以分享 prototype 范围(而不是请求范围)的一些实际用例,那就太棒了。
答案 0 :(得分:6)
我使用原型bean来声明配置的表单元素(例如,配置为验证名称,电子邮件地址的文本框),并为我在webapp中创建的每个表单获取它们的“活”实例。细节并不重要,只有原则,我会这样总结:
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 { }