2012-03-12 90 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。