Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring框架页面上的同一对象刷新,如何避免呢_Java_Spring_Spring Bean - Fatal编程技术网

Java Spring框架页面上的同一对象刷新,如何避免呢

Java Spring框架页面上的同一对象刷新,如何避免呢,java,spring,spring-bean,Java,Spring,Spring Bean,这可能是一个初学者的问题,与java如何为网站服务有关。我来自PHP背景,每个请求之前的状态都被清除 为什么当我定义一个bean时(如下面所示),页面刷新时会返回相同的对象哈希 @Bean 公共面包屑面包屑() { 列表汇编程序=新的ArrayList(); add(newblogpassembler()); 返回新的面包屑(new RenderStrategy(),Assembler); } 在我的控制器中: System.out.println(breadCrumbs.hashCode()

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

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

@Bean
公共面包屑面包屑()
{
列表汇编程序=新的ArrayList();
add(newblogpassembler());
返回新的面包屑(new RenderStrategy(),Assembler);
}
在我的控制器中:

System.out.println(breadCrumbs.hashCode());
在每个页面请求上,返回相同的哈希代码:

817233364
817233364
817233364
817233364
817233364
817233364
817233364
817233364
817233364
817233364
817233364

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

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

@Bean
@范围(“原型”)
公共面包屑面包屑()
{
列表汇编程序=新的ArrayList();
add(newblogpassembler());
返回新的面包屑(new RenderStrategy(),Assembler);
}

希望有帮助。

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

@Bean
@范围(“原型”)
公共面包屑面包屑()
{
列表汇编程序=新的ArrayList();
add(newblogpassembler());
返回新的面包屑(new RenderStrategy(),Assembler);
}

希望有帮助。

@syedamar写的是正确的,但不完整。
将您的
面包屑制作成原型只是解决方案的一部分。这意味着它将在每次调用时创建,而不仅仅是一次。
然而,这是不够的,因为您的控制器是单例的,这意味着它只被创建一次,并且只调用breadcrumbsbean一次。这就是为什么在不同的控制器上得到不同的实例,而不是在不同的调用上

要解决这个问题,您需要单例控制器在每个请求上获得不同的原型。
一种方法是使用Spring的
ObjectFactory
接口:

@Controller
public class SomeController {

  private ObjectFactory<BreadCrumbs> breadCrumbsFactory;

  @Autowired
  public SomeController(ObjectFactory<BreadCrumbs> breadCrumbsFactory) {
    this.breadCrumbsFactory = breadCrumbsFactory;
  }

  public void something() {
    BreadCrumbs breadCrumbs = breadCrumbsFactory.getObject(); // this will give you a different instance on each call
  }
}
@控制器
公共类控制器{
私人物品工厂面包屑工厂;
@自动连线
公共SomeController(ObjectFactory面包屑工厂){
this.breadCrumbsFactory=breadCrumbsFactory;
}
公之于众{
BreadCrumbs BreadCrumbs=breadCrumbsFactory.getObject();//这将在每次调用时为您提供不同的实例
}
}

您可以在

上阅读更多关于它的内容@syedamar所写的内容是正确的,但并不完整。
将您的
面包屑制作成原型只是解决方案的一部分。这意味着它将在每次调用时创建,而不仅仅是一次。
然而,这是不够的,因为您的控制器是单例的,这意味着它只被创建一次,并且只调用breadcrumbsbean一次。这就是为什么在不同的控制器上得到不同的实例,而不是在不同的调用上

要解决这个问题,您需要单例控制器在每个请求上获得不同的原型。
一种方法是使用Spring的
ObjectFactory
接口:

@Controller
public class SomeController {

  private ObjectFactory<BreadCrumbs> breadCrumbsFactory;

  @Autowired
  public SomeController(ObjectFactory<BreadCrumbs> breadCrumbsFactory) {
    this.breadCrumbsFactory = breadCrumbsFactory;
  }

  public void something() {
    BreadCrumbs breadCrumbs = breadCrumbsFactory.getObject(); // this will give you a different instance on each call
  }
}
@控制器
公共类控制器{
私人物品工厂面包屑工厂;
@自动连线
公共SomeController(ObjectFactory面包屑工厂){
this.breadCrumbsFactory=breadCrumbsFactory;
}
公之于众{
BreadCrumbs BreadCrumbs=breadCrumbsFactory.getObject();//这将在每次调用时为您提供不同的实例
}
}

您可以在

上了解更多关于它的信息@Scope(“prototype”)注释不起作用,但仍然得到相同的行为。只有当我在控制器中为同一面包屑服务定义两个@Autowired注释时,它才起作用。对于每个服务,在使用范围注释时,对象是不同的。在页面刷新时,这些对象保持相同的不同哈希。在页面刷新时,bean方法甚至没有被访问。@Scope(“prototype”)注释不起作用,仍然得到相同的行为。只有在我的控制器中为同一面包屑服务定义两个@Autowired注释时,它才起作用。对于每个服务,在使用范围注释时,对象是不同的。在页面刷新时,这些对象保持相同的不同哈希。在页面刷新时,甚至不访问bean方法。