java - Web 应用程序中的 Spring beans 作用域。最佳实践

标签 java spring jakarta-ee spring-mvc

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

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

最佳答案

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

长存状态

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

短暂的状态

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

无状态

这是单例,默认由 spring 生成。除非我对状态有特定要求,否则这是我通常对所有 bean 坚持的选项。当然,它的性能也更高,因为该 bean 仅创建一次并供所有人使用。

在您的情况下,您的 DAO 和服务应该是无状态的(如果他们没有重新考虑您是如何实现它们的),因此应该是单例的。 Controller 应该再次成为单例,但问题是它们是否包含状态?。我不会太担心内存消耗,记住万恶之源是过早优化。坚持最佳做法,如果这不起作用,请修复它。

关于java - Web 应用程序中的 Spring beans 作用域。最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15145258/

相关文章:

java - jqgrid java服务器端分页

servlets - 请求 JSESSIONID 和响应 JSESSIONID 应该不同吗?

eclipse - 如何通过Eclipse从Eclipse Java SE版本升级到Eclipse for Java EE?

java - 避免Gradle插件之间的依赖关系/类路径冲突

java - jOOQ + Spring : PSQLException: current transaction is aborted, 命令被忽略直到事务结束

java - Spring Hibernate查询与非主键的一对一关系

java - 用户三次错误尝试后显示验证码

java - 如何在java运行时创建新添加的类的实例

java - 在 Android 后台下载 Facebook 图像

java - 无法导入 android.support.v4.content.ContextCompat