多次创建的春豆

时间:2018-08-10 05:59:34

标签: java spring architecture

我刚接触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”。我该如何限制呢??

1 个答案:

答案 0 :(得分:0)

像tomcat这样的Web容器的目的是能够独立运行应用程序,以便它们可以启动和停止而不会互相影响。如果您认为将来可能会有多个应用程序也需要相同的服务,则可以制作一个单独的应用程序并公开用于操作的API。