我刚刚接触 Spring,面临一个设计问题。问题是我有一个 Maven 多个模块项目。项目结构如下。
模块后台 - 打包( war )
module-ws - 打包( war )
module-dao - 打包(jar)
模块共享-打包(jar)
在“模块共享”中,我的所有服务类和“module-dao”中都存在所有与 dao 相关的代码。 module-shared 和 module-dao 位于 module-backoffice 和 module-ws 的构建路径中。
现在的问题是当我运行 module-backoffice war 和 module-ws war Spring 会创建 Service 类 bean 和 dao 类 bean 的两个实例。
我应该怎么做才能创建一个 service 类和 dao 类的实例并在多个 war 之间共享?请帮忙。谢谢你。
模块共享中的代码:下面是服务工厂类
@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 部署两次 war 时,然后在控制台中打印两次“Bootstrap”。我该如何限制它?
最佳答案
像 tomcat 这样的 Web 容器的目的是能够独立运行应用程序,以便它们可以启动和停止而不互相影响。如果您认为 future 可能有多个应用程序也需要相同的服务,您可以创建一个单独的应用程序并公开用于操作的 API。
关于java - Spring Bean 创建多次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51779903/