首页 > 解决方案 > Spring框架在页面刷新时相同的对象,如何避免它

问题描述

这可能是一个初学者的问题,并且与 java 如何为网站服务有关。我来自 PHP 背景,对于每个请求,以前的状态都会被清除。

为什么当我定义一个 bean 时,如下所示,页面刷新时返回相同的对象哈希?

@Bean
public BreadCrumbs breadCrumbs()
{
    List<AssemblerInterface> assemblers = new ArrayList<AssemblerInterface>();
    assemblers.add(new BlogPostAssembler());
    return new BreadCrumbs(new RenderStrategy(), assemblers);
}

在我的控制器中:

System.out.println(breadCrumbs.hashCode());

在每个页面请求上,都会返回相同的哈希码:

817233364
817233364
817233364
817233364
817233364
817233364
817233364
817233364
817233364
817233364
817233364

并且 Breadcrumbs 组件的状态会累积(一遍又一遍地显示相同的项目)。问题是如何避免它?

标签: javaspringspring-bean

解决方案


那是因为在 spring 中 bean 的默认范围是 Singleton,所以容器创建了该 bean 的单个实例,并且对该 bean 名称的所有请求都将返回相同的对象,该对象被缓存。如果您希望在每个请求上都有一个新实例,则需要制作范围原型

@Bean
@Scope("prototype")
public BreadCrumbs breadCrumbs()
{
  List<AssemblerInterface> assemblers = new ArrayList<AssemblerInterface>();
  assemblers.add(new BlogPostAssembler());
  return new BreadCrumbs(new RenderStrategy(), assemblers);
}

希望能帮助到你。


推荐阅读