我刚接触Spring并面临设计问题。问题是我有一个Maven多个模块项目。项目结构如下。
module-backoffice-包装(战争)
module-ws-包装(战争)
module-dao-包装(罐子)
模块共享-包装(罐子)
在“模块共享”中,我所有的服务类都在“模块-dao”中,所有与dao相关的代码都存在。 module-shared和module-dao位于module-backoffice和module-ws的构建路径中。
现在的问题是,当我运行module-backoffice war和module-ws war时,Spring会创建Service类bean和dao类bean的两个实例。
我应该怎么做才能在多个战争中创建并共享一个服务类和dao类的实例?请帮忙。谢谢。
共享模块中的代码:以下是服务工厂类
@org.springframework.stereotype.Service
public class Services {
@Autowired
private List<Service> services;
private static final Map<Class<?>, Service> serviceCache = new ConcurrentHashMap<Class<?>, Service>();
@PostConstruct
public void initServiceCache() {
services.forEach(service -> serviceCache.put(service.getClass(), service));
services = null;
}
public static Bootstrap bootstrap() {
return (Bootstrap) serviceCache.get(Bootstrap.class);
}
服务类为:
@Component
public class Bootstrap implements Service {
public Bootstrap() {
System.out.println("Bootstrap");
}
}
当我运行tomcat部署两次战争时,在控制台中两次打印了“ Bootstrap”。我该如何限制呢??
答案 0 :(得分:0)
像tomcat这样的Web容器的目的是能够独立运行应用程序,以便它们可以启动和停止而不会互相影响。如果您认为将来可能会有多个应用程序也需要相同的服务,则可以制作一个单独的应用程序并公开用于操作的API。