我目前正在开发一个类结构,该类结构对每个RequestMapping使用单例类。我知道Spring(默认情况下)以多线程能力处理请求,但是我只是想确保现在要布局的内容最终能够按照我想要的方式工作。
此外,例如,如果我发出请求,并且单例类创建了内存数据库。在来自同一用户/客户端的连续请求中,下一个请求将能够使用先前存储的任何信息,或者当响应被发回并重新创建时,用于请求的Spring容器被销毁(某种形式)。一个新请求?
最后,如果以任何方式为此目的创建单例类都不好,那么我欢迎任何建议。创建单例类的初衷是简单地使ScheduleManager类负责整个对象的创建,如果以后需要我采取某些步骤来创建完整的ScheduleManager对象(例如,建立与数据库的连接),那么我可以这样做,而不必为构造函数创建一个额外的参数,并使实现类(RequestController)负责创建这样的数据库连接。
// Partial of RequestController.java
@RestController
public class RequestController {
private static final String DATA_DIR = System.getProperty("user.dir") + "/data/";
private static final Logger LOGGER = Logger.getLogger(RequestController.class);
@PostMapping(value = "/generateSchedules")
public JsonObject scheduleRequest(@RequestBody JsonObject requestedClasses) {
JSONObject request = gsonToJson(requestedClasses);
JSONObject response = ScheduleManager.getInstance().generateSchedules(request);
return jsonToGson(response);
}
}
// Partial of singleton class ScheduleManager
public class ScheduleManager implements RequestManager {
private static ScheduleHandler handler;
private ScheduleManager() {}
private static class ScheduleManagerHolder {
private static final ScheduleManager INSTANCE = new ScheduleManager();
}
public static ScheduleManager getInstance() {
handler = ScheduleHandler.getInstance();
return ScheduleManagerHolder.INSTANCE;
}
public JSONObject generateSchedules(JSONObject request) {
handler.handlePost(request);
List<Schedule> schedules = GoldPan.getInstance().generate();
JSONArray schedulesAsJson = listToJsonArray(schedules);
JSONObject output = new JSONObject();
output.put("schedules", schedulesAsJson);
return output;
}
}
所以,我期望的是,每个向RequestController发送请求的唯一客户端都将拥有自己自己的类似于ScheduleManager单例类的实体/容器,而不是在所有请求中共享单个ScheduleManager(类似于我心中暗含着“单身”的标签。