Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.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
Spring boot 应用程序启动时的单例_Spring Boot_Singleton - Fatal编程技术网

Spring boot 应用程序启动时的单例

Spring boot 应用程序启动时的单例,spring-boot,singleton,Spring Boot,Singleton,我正在创建一个小游戏,我希望有一个游戏室和游戏室中的一堆游戏。这将是一个spring引导应用程序。所以我想在应用程序开始时启动游戏室。然后,无论何时创建新游戏,我都会将其添加到游戏列表中。这是个好主意吗?或者是否存在任何潜在的陷阱 public class GameRoon{ private static GameRoom instance = null; List<Game> games = new ArrayList(); private GameRoom(

我正在创建一个小游戏,我希望有一个游戏室和游戏室中的一堆游戏。这将是一个spring引导应用程序。所以我想在应用程序开始时启动游戏室。然后,无论何时创建新游戏,我都会将其添加到游戏列表中。这是个好主意吗?或者是否存在任何潜在的陷阱

public class GameRoon{

   private static GameRoom instance = null;
   List<Game> games = new ArrayList();

   private GameRoom() {}

   public static GameRoom getIsntance() {
    if(instance == null) {
       instance = new GameRoom();
    }
    return instance;
  }
}
公共类游戏机{
私有静态游戏室实例=null;
列表游戏=新建ArrayList();
私人游戏室(){}
公共静态游戏室getIsntance(){
if(实例==null){
实例=新游戏室();
}
返回实例;
}
}
以上是我未完成的单身。。我有两个问题。 1.在春季开机时启动这个是个好主意吗?
2.在spring boot中这样使用singleton是更好还是有更好的方法呢?

singleton一直备受争议,您总会找到使用它的理由,而不是使用它的理由

在我看来,如果您的类的责任是持有一个在应用程序中共享的状态(考虑一个包含一些数据的注册表),我看不出有任何问题。
很明显,您共享数据,并且必须确保管理并发访问

Singleton的主要缺点是测试:您有一个全局状态,但理想情况下,在单元测试期间,您希望测试一些代码,而不依赖Singleton类(而不是模拟类)。
多亏了Spring,您仍然可以解决这个问题:将GameRoom定义为Springbean(默认范围为Singleton),它与任何其他bean一样被注入。这允许在单元测试期间对其进行模拟,即使下面有一个单例行为


希望有帮助。

如果我把
游戏室
制作成一个Springbean,每次创建一个新游戏时,我都会制作一个新游戏()并将其添加到一个列表中,它会工作吗。这是否适用于并发访问。或者
Game
也需要是一个singleton/bean才能工作吗?GameRoom是singleton(整个应用程序中的一个实例),然后您可以在列表中添加/删除游戏(游戏只是一个plein Java类)。在并发性方面,您可以添加方法来从列表中添加/删除游戏,以便控制列表的更改方式