当前位置: 首页 > 知识库问答 >
问题:

Spring Singleton意味着类级没有数据共享?

刘嘉木
2023-03-14

我很困惑。

public class Calculator {
 private List<String> operations = new ArrayList<String>();


public void calculate(String op, double val) {
 operations.add(op);
 // do some calculations
}


public List<String> getAllOperations() {
 return operations;
}

}
public class CalculatorClient{

@Autowired
private Calculator calculator;

public void useCalc () {
  calculator.calculate("Add",100);
  calculator.calculate("Div",100);
  calculator.calculate("Diff",100);
  List<String> allOperations = calculator.getAllOperations();
// Do something..
}
}

我们假设CalculatorClient useCalc被多次调用不同的操作。最终,calculator中的operations将包含在该计算器上完成的所有操作。

所以问题是这样的:

这个Spring的局限性--不能在类内的方法之间有效地共享信息吗?如果是这样,如何在方法之间共享这种信息?

我知道有原型bean作用域。这是唯一的解决办法吗?顺便说一句,在这里prototype不是一个解决方案,因为使用prototype将在每次调用Calculator时实例化一个新类:

  calculator.calculate("Add",100); // New 
  calculator.calculate("Div",100); // New
  calculator.calculate("Diff",100); // New

而且既然Singleton是默认的作用域--难道开发人员不是在不经意间引入了这样的bug吗?

共有1个答案

濮阳振海
2023-03-14

单例bean的一个常见用例是将服务注入到其他对象中。

例如,要为对象提供连接到数据库的服务,需要“自动连接”数据库连接bean。

您不希望每次都创建数据库的新实例,因此单例bean是有意义的。

由于想法是并发处理几个请求,所有这些对象通常都已经编码,而没有使用实例变量共享的公共状态。

这不是“限制”,而是最常见用例的默认。

我知道有原型bean作用域。这是唯一的解决办法吗?

因此,在您的示例中,可以执行以下操作:

@Autowired
private CalculatorFactory calcFactory;

public void useCalc () {
   calculator = calcFactory.createCalculator();
   calculator.calculate("Add",100);
   calculator.calculate("Div",100);
   calculator.calculate("Diff",100);
   List<String> allOperations = calculator.getAllOperations();
   // Do something..
}

}

 类似资料:
  • 根据C 11标准(草案n3337)§5/9: -如果两个操作数的类型相同,则无需进一步转换。 -否则,如果两个操作数都具有有符号整数类型或都具有无符号整数类型,则整数转换秩较小的操作数类型应转换为秩较大的操作数类型。 -否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数类型的秩,则应将具有有符号整数类型的操作数转换为具有无符号整数类型的操作数的类型。 -否则,如果有符号整数类型的操作数

  • 我想创建一个

  • 问题内容: 假设我们在A包中有A类,在B包中有B类。如果类A的对象引用了类B,则称这两个类之间具有耦合。 为了解决耦合问题,建议在包A中定义一个接口,该接口由包B中的类实现。然后,类A的对象可以引用包A中的接口。这通常是“依赖倒置”的一个例子。 这是“在接口级别将两个类解耦”的示例。如果是,当两个类耦合时,它如何消除类之间的耦合并保持相同的功能? 问题答案: 让我们创建一个虚拟的例子。 套餐类别:

  • 假设A包中有A类,B包中有B类。如果类A的对象引用了类B,那么这两个类之间就称为耦合。 为了解决耦合问题,建议在包A中定义一个接口,该接口由包B中的类实现。然后,类A的对象可以引用包A中的接口。这通常是《依赖倒置》中的一个例子。 这是不是“在接口层解耦两个类”的例子,如果是,它是如何去除类之间的耦合,并在两个类耦合时保留相同的功能的?

  • 问题内容: 我很好奇,需要快速找到答案。Google不会有太大帮助。 Java Persistence API具有这些属性,这些属性告诉框架对关联实体进行级联操作: 我知道前两个是什么意思:当我持久化具有B的对象A时,也持久化B,并且在删除A时也删除B。 但是我无法理解其他两个人的成就。救命? 问题答案: REFRESH的意思是“将数据库中的任何状态更改拉到我的表示中”。级联这很简单;这意味着将刷

  • 据我所知,<code>override</code>关键字声明给定的声明实现了一个基本<code>virtual</code>方法,如果没有找到匹配的基本方法,编译应该失败。 我对< code>final关键字的理解是,它告诉编译器任何类都不能覆盖这个< code >虚拟函数。 那么是多余的吗?它似乎编译得很好。最终传达哪些信息而信息不传达?这种组合的用例是什么?