bean 的会话范围在 Spring MVC 应用程序中如何工作?

2024-02-11

我对 Spring MVC 还很陌生,我对会话范围一颗豆子。

进入一个项目我有一个Cart豆子,这个:

@Component
@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)
public class Cart {


    private Map<Product, Integer> contents = new HashMap<>();

    public Map<Product, Integer> getContents() {
        return contents;
    }

    public Set<Product> getProducts() {
        return contents.keySet();
    }

    public void addProduct(Product product, int count) {

        if (contents.containsKey(product)) {
            contents.put(product, contents.get(product) + count);
        } 
        else {
            contents.put(product, count);
        }
    }


    public void removeProduct(Product product) {
        contents.remove(product);
    }

    public void clearCart() {
        contents.clear();
    }

    @Override
    public String toString() {
        return contents.toString();
    }

    public double getTotalCost() {
        double totalCost = 0;
        for (Product product : contents.keySet()) {
            totalCost += product.getPrice();
        }
        return totalCost;
    }

}

所以这个bean会被容器自动检测为组件,并将其设置为会话bean by:

@Scope(value=WebApplicationContext.SCOPE_SESSION, proxyMode = ScopedProxyMode.TARGET_CLASS)

因此,根据我的理解,这意味着它会自动为每个用户会话创建一个 bean。

在我的例子中Cart类表示一个购物车,登录用户将想要购买的商品放入其中。这是否意味着存在单一Cart将每个登录用户部分的 bean 添加到HttpSession?因此,该 bean 已进入会话,用户可以从中添加或删除项目。这种解释正确还是我错过了什么?

另一个疑点与proxyMode = ScopedProxyMode.TARGET_CLASS属性。这到底是什么意思呢?为什么应用到这个bean上呢?


所以,根据我的理解,这意味着它是自动的 为每个用户会话创建一个 bean。

会话 bean 将为每个用户创建,但仅在请求时创建。换句话说,如果对于给定的请求,您实际上不需要该 bean,则容器不会为您创建它。从某种意义上来说,这就是“懒”。

典型用途是

@Controller
public class MyController {
    @Autowired
    private MySessionScopeBean myBean;
    // use it in handlers
}

在这里,您将会话作用域 bean 注入到单例作用域 bean 中。 Spring要做的就是注入一个proxybean,在内部,将能够生成一个真正的MySessionScopeBean每个用户的对象并将其存储在HttpSession.

注释属性和值

proxyMode = ScopedProxyMode.TARGET_CLASS

定义 Spring 如何代理你的 bean。在这种情况下,它将通过保留目标类来进行代理。它将使用 CGLIB 来实现此目的。另一种选择是INTERFACES其中 Spring 使用 JDK 代理。它们不保留目标 bean 的类类型,仅保留其接口。

您可以在此处阅读有关代理的更多信息:

  • JDK动态代理和CGLib有什么区别? https://stackoverflow.com/questions/10664182/what-is-the-difference-between-jdk-dynamic-proxy-and-cglib

这是关于请求范围的相关帖子:

  • 将 HttpServletRequest 注入控制器 https://stackoverflow.com/questions/22674044/inject-httpservletrequest-into-controller
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

bean 的会话范围在 Spring MVC 应用程序中如何工作? 的相关文章

随机推荐

  • android 如何将对象保存到文件?

    有人知道如何在 android 上将对象保存和恢复到文件吗 使用 openFileOutput 打开文件 http developer android com guide topics data data storage html file
  • 页面重新加载后,Meteor.user() 返回未定义

    问题是我想检查用户是否通过我的路线中的 onBeforeAction 内的 Meteor user 登录 问题是 页面重新加载后 Meteor user 在加载之前的一瞬间返回未定义 这是我的路线配置 Router map function
  • 设置 dbt 日期变量

    我试图将 dbt 模型中的日期变量设置为 7 天前的日期 该模型将针对 Redshift 数据库运行 我已执行以下操作来设置变量 但是收到错误 DATE ADD 未定义 set start date TRUNC DATE ADD day 7
  • python pycparser设置错误

    我在 CentOS 7 上通过 pip 设置 pyparser 时看到以下错误 usr bin python2 u c import setuptools tokenize file tmp pip build PMzCYU pycpars
  • GMSAutocompleteViewController iOS,如何更改搜索栏中的文本颜色[重复]

    这个问题在这里已经有答案了 我正在使用 GMSAutocompleteViewController 并想要更改 searchBar 中的 textColor 但找不到方法 我设法更改了一些颜色但没有更改 searchBar 文本 我尝试过以
  • hostconfig.json 在哪里(Docker 桌面 + WSL2 环境)

    据我所知 docker不支持任何在创建容器后更改端口映射的命令 但这个答案说 通过更改 hostconfig json 文件 我可以更改端口映射 如何将端口映射分配给现有的 Docker 容器 https stackoverflow com
  • `System.currentTimeMillis()` 在多个进程中是否正确?

    我们遇到这样的情况 主进程写入日志 然后它会生成多个工作进程 这些进程会写入自己的日志 我希望工作人员通过主服务器登录 但由于某种原因 这个想法遭到了抵制 我想知道的是 我可以相信多个文件中最终的时间戳彼此一致吗 即 如果我将日志文件合并为
  • 让 WiX/Burn 检测所需的 .NET Framework 版本

    我怎样才能拥有Burn http en wikipedia org wiki WiX Burn检测是否安装了所需的 NET 4 5 框架 如果没有在启动自定义 UI 之前通知用户该安装需要 NET 4 5 才能运行 如果没有先决条件检查 我
  • 当我使用 Chutzpah.json 文件时,使用 Chutzpah 运行测试时出现问题

    当我提供 Chutzpah json 文件时 我在让 Chutzpah 运行我的打字稿测试时遇到问题 我的项目如下所示 我的 Chutzpah json 文件如下所示 Compile Mode External ExtensionsWith
  • 透明视图上的 UITapGestureRecognizer

    我有一个带有视图的树 其中最高级别的视图是透明的 并且包含图像或标签 具有透明背景 将 UITapGestureRecognizer 附加到此视图时 我仅收到有关包含图像的视图的通知 另外 如果我将视图留空 那么仅当背景颜色与 UIColo
  • “按 Enter 开始游戏” XNA 简介屏幕

    我创建了一个介绍屏幕 其中包含 按 Enter 开始游戏 然后退出 当然退出没有问题 但让游戏开始有点困难 有什么建议吗 最简单的方法是设置状态机 看起来真的很简单 enum GameState TitleScreen 0 GameStar
  • 如何从 Fluent-ffmpeg 传输到 AWS s3?

    我想 const passthroughStream new PassThrough ffmpeg stream audioBitrate 8 output passthroughStream end true on progress p
  • 如何编辑dll档案?

    好吧 所以我对 DLL 不太了解 但我需要编辑其中一些 那些看起来像存档文件的文件 如 firefox的xul dll windows twain 32 dll 当我尝试在 NET Reflector 中打开它们时 它无法打开它们 这里的一
  • 从 csv 文件加载约束(amazon deequ)

    我正在查看 Deequ 它看起来是一个非常好的图书馆 我想知道是否可以从 HDFS 中的 csv 文件或 orc 表加载约束 假设我有一张包含这些类型的表 case class Item id Long productName String
  • 在线性模型中结合cbind和paste

    我想知道我怎样才能想出一个lm公式语法使我能够使用paste和 一起cbind用于多元多元回归 Example 在我的模型中 我有一组变量 对应于下面的原始示例 data mtcars depVars lt paste mpg disp i
  • 如何将列表转换为每行包含 N 个项目的 CSV 文件?

    我想创建一个新的 CSV 文件 每行包含 3 个项目 我的源文件如下所示 没有新行 换行符 12123 1324 232324 243443 234 2345 2334 2445 22355 222234 2345 现在我想将此文件转换为
  • PHP 数组语法解析错误左方括号“[”[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个返
  • 将 Base64 转换为 png 并保存在设备中 React Native Expo

    我一直在尝试使用 React Native 和 Expo 在移动设备上保存图像 我尝试过这些软件包 import RNFetchBlob from react native fetch blob import RNfs from react
  • .png 图像在 IE7、IE8 中无法正确呈现

    它们在 FF Safari 中看起来很棒 但社交媒体图标在 IE 中无法正确呈现 http www erisdesigns net STAGE ED1 3 http www erisdesigns net STAGE ED1 3 这是 IE
  • bean 的会话范围在 Spring MVC 应用程序中如何工作?

    我对 Spring MVC 还很陌生 我对会话范围一颗豆子 进入一个项目我有一个Cart豆子 这个 Component Scope value WebApplicationContext SCOPE SESSION proxyMode Sc