2012-03-12 48 views
22

我对Spring beans的各个范围有清晰的认识。但是我正在寻找一些bean在企业级项目中的原型范围的用例。如果您可以分享原型范围(而不是请求范围)的一些真实生活用例,那就太好了。Spring原型范围 - 用例?

+0

我很惊讶这个没有代码的简短问题,没有被标记为不具有建设性,太宽泛。不要误解我的意思,我认为这个问题很好 – 2015-11-16 14:19:36

回答

4

我使用的原型主要是与弹簧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());当调用该方法,春天就会创建一个新的帧解码器的实例并返回它。

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

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

+0

这个查找方法由Spring doc解释:http://docs.spring.io/spring/docs/current/spring-framework-reference/html/beans。 html#beans-factory-method-injection – 2015-04-07 05:59:45

5

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

  • 有是有很多的配置参数
  • 您需要创建它的实例与一组预定义配置的一类(fancy1 ,fancy2,STC)
  • 认为applicationContext.getBean("myBeanConfiguredFancy1")作为一种工厂方法的作为XML
0

我们可以在模型类的情况下使用原型范围预先创建的实例(也CA因为应用程序需要为每个线程/请求提供不同的模型类实例。

+0

那么它不应该是请求作用域而不是原型作用域? – 2017-01-14 14:03:05

2

作为以前曾在SpringSource工作并与开发人员讨论过这个主题的人。这是我的要求。 Prototype非常适合用于测试事物,因此名称原型并不是创建新的或更多的描述,每次从Spring容器请求它时创建bean的新实例。

多年来,我也发现在我的使用中,我不能在任何其他地方的原型在任何真实世界的生产应用中都有意义。如果你的对象持有状态,它通常不应该是一个Spring bean。我在所有应用程序中发现,所有的bean都是Services,Repositories和Singleton非状态持有对象,我需要添加诸如事务性,JPA,JMS之类的功能,这些功能为我们提供了POJO不需要的企业功能,没有。

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