知识卡片
Bean作用域与会话级别Bean的必要性
内容
Spring容器管理的Bean默认是单例(Singleton)——整个应用生命周期内只创建一个实例,所有请求共享同一份状态。这对无状态的Service通常没问题,但像购物车这种”每个用户都要有自己独立一份数据”的场景,如果Service本身持有购物车商品列表这类可变状态,单例意味着所有用户会互相覆盖彼此的购物车数据。解法是把该Bean的作用域从Singleton改成Session级别,让容器为每个会话单独维护一个实例,并通过代理机制让注入方仍然能像用单例一样正常引用它。发散:这提醒我们Bean的默认单例假设隐含着”这个类不该持有请求/用户相关的可变状态”,一旦某个Service开始存放和特定用户绑定的数据,就是该检查其作用域是否还适合继续用默认单例的信号。
参考来源
《Spring Boot应用开发实战》第9章《实战2:在线商城》