java - Spring Bean 创建多次

标签 java spring architecture

我刚刚接触 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/

相关文章:

java - 在数组列表中存储字符串序列

java - 具有私有(private)构造函数的 Singleton 类的 Spring(创建 bean 时出错,没有可见的构造函数)

spring - JNDI 不适用于 HornetQ 和 tomcat

design-patterns - 关于 MVP 和 MVVM 的一些混淆

dart - Flutter/Dart使用范围模型与后代和导航器

c# - 模块化网站设计,使用 ASP.NET MVC,我想要一个不那么单一的设计

java - 为什么这段代码会在 Windows 上消失?

java - 如何在不删除while的情况下避免100%的CPU使用率(true)

java - 有效比较字符串中的连续字符

Spring 安全 token 持久性存储不起作用