Spring boot 应用程序启动时的单例
我正在创建一个小游戏,我希望有一个游戏室和游戏室中的一堆游戏。这将是一个spring引导应用程序。所以我想在应用程序开始时启动游戏室。然后,无论何时创建新游戏,我都会将其添加到游戏列表中。这是个好主意吗?或者是否存在任何潜在的陷阱Spring boot 应用程序启动时的单例,spring-boot,singleton,Spring Boot,Singleton,我正在创建一个小游戏,我希望有一个游戏室和游戏室中的一堆游戏。这将是一个spring引导应用程序。所以我想在应用程序开始时启动游戏室。然后,无论何时创建新游戏,我都会将其添加到游戏列表中。这是个好主意吗?或者是否存在任何潜在的陷阱 public class GameRoon{ private static GameRoom instance = null; List<Game> games = new ArrayList(); private GameRoom(
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类)。在并发性方面,您可以添加方法来从列表中添加/删除游戏,以便控制列表的更改方式