Spring bean在Web应用程序中的作用域.最佳做法

ybo*_*dar 6 java spring spring-mvc java-ee

我对这个话题有些怀疑.在我们的大多数Spring bean(dao`s,服务和控制器)的应用程序中,我们使用"请求"范围.这种方法允许我们减少内存使用并创建无状态层.但另一方面,我们在Spring上下文初始化的每个请求上都松散了性能.我想在"单例"或"原型"范围内创建一些bean,例如DAO层.

您在应用程序中使用了哪些技术?也许存在一些设计Spring Web应用程序bean范围的建议?

ram*_*inb 15

我在决定时倾向于使用的一般规则如下:

万岁州

这是需要在多个请求(http)上保留状态的时候.在这种情况下,存储在会话范围中是有意义的.

短暂的国家

当您需要为任何给定请求保持状态时.也许你正在为表单实现类似支持bean的东西.在这种情况下,我使用请求范围.

没有国家

这是单例,默认情况下是从spring生成的.除非我对状态有特定要求,否则我通常会坚持使用所有bean.当然它也更高效,因为bean只创建一次并被所有人使用.

在您的情况下,您的DAO和服务应该是无状态的(如果他们不重新考虑您如何实现它们),因此应该是单身人士.控制器应该再次单独使用,但问题是它们是否包含状态?.我不会过多担心内存消耗,记住所有邪恶的根源是过早优化.坚持使用最佳实践,如果不起作用则修复它.


psa*_*ate 5

Singleton:根据Spring IoC容器将单个bean定义范围限定为单个对象实例.

原型:将单个bean定义范围限定为任意数量的对象实例.

请求:将单个bean定义范围限定为单个HTTP请求的生命周期; 也就是说,每个HTTP请求都有自己的bean实例,它是在单个bean定义的后面创建的.仅在Web感知Spring ApplicationContext的上下文中有效.

会话:将单个bean定义范围限定为HTTP会话的生命周期.仅在Web感知Spring ApplicationContext的上下文中有效.

全局会话:将单个bean定义范围限定为全局HTTP会话的生命周期.通常仅在portlet上下文中使用时有效.仅在Web感知Spring ApplicationContext的上下文中有效.

除了这些信息之外,您应该将DAO标记为@Repository,将控制器标记为@Controller,将服务层标记为@Service.

服务,存储库和控制器讨论