Spring原型范围 – 用例?

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

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

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

我主要使用原型与spring lookup-method结合使用。 我的应用程序是一个游戏服务器 ,需要解码tcp端口的传入字节。 请考虑以下bean定义

       

在协议实现类中,我有以下代码来创建帧解码器pipeline.addLast("lengthDecoder", createLengthBasedFrameDecoder()); 调用此方法时,spring将创建一个新的帧解码器实例并返回它。

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

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

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

多年来我在使用中发现,在任何现实世界的生产应用中,原型都有意义的任何其他地方我都无法做到。 如果对象保持状态,则通常不应该是Spring bean。 我在所有应用程序中发现,所有bean都是Services,Repositories和Singleton非状态保持对象,我需要添加Transactionality,JPA,JMS等function,这些function为我们提供了POJO所具有的企业function。有。

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

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

每次应用程序代码对bean发出请求时,原型范围都会导致创建新的bean实例。

您应该知道,destroy bean生命周期方法不会被称为原型范围bean,只会调用初始化回调方法。 因此,作为开发人员,您负责清理原型范围的bean实例以及其中包含的任何资源。

原型bean范围的Java配置示例 –

@零件

@Scope( “原型”)

项目清单

公共类BeanClass {}