繁体   English   中英

如何注册可以被多个WAR共享的bean(Spring boot + Tomcat)

[英]How to register beans that can be shared by multiple WARs (Spring boot + Tomcat)

我正在使用 Spring Boot 开发应用程序并将多个 WAR 部署到外部 tomcat。 我想在 tomcat 启动时用这些 WAR 注册一个可共享的 bean。

我使用:Java8、Spring boot(2.5.5) 和 Tomcat9

Bean 我想被 Apps 分享:

public class TestData {
    private String username;
    
    public String getUsername() {
        return username;
    }
    public void setUsername(String username) {
        this.username = username;
    }
}

SampleApp(有多个应用程序以相同的方式自动装配 TestData 的实例):

@SpringBootApplication
@RestController
public class App extends SpringBootServletInitializer {
    @Autowired
    TestData testData;
    
    public static void main(String[] args) {
        SpringApplication.run(App.class, args);
    }

    @Override
    protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
        return application.sources(App.class);
    }

    @RequestMapping(value = "SampleApp1", method = RequestMethod.GET)
    public String getUsername() {
        return testData.getUsername();
    }
}

创建一个新项目,将其命名为 yourapplication-commons 并在那里创建您的 bean。 将此项目作为依赖项添加到您将转换为战争的项目。 如果您使用的是 maven,请将其添加到所有需要此依赖项的项目的 pom.xml 中,如果有任何其他工具,请进行相应管理。 参考: https : //everyday.codes/java/creating-production-artifacts-in-a-multi-module-maven-project/

我认为您的问题是关于在部署在同一网络服务器中的不同应用程序容器之间共享一个单例 Bean 的数据。

出于安全原因,这是不可能的。 每个部署的应用程序都有自己的类加载器,因此无法轻松访问驻留在其他容器内存中的 bean。

我建议您添加一个由不同部署的应用程序访问的微服务并使用它。 它可以通过例如 OpenFeign 作为客户端轻松访问,如果操作正确,它几乎看起来像一个带有 getter 和 setter 的 bean。

有几种方法可以解决您的问题,可以在不同级别上解决它。

  1. 创建一个包含所需内容的共享库并将其安装到 Tomcat 服务器。 “安装”通常意味着将组装好的 jars 放入$CATALINA_HOME/lib目录或类似目录。 Class Loader HOW-TO可以为您提供更多详细信息。 不确定它如何与类的共享实例一起工作,但绝对可以通过共享库共享(例如工厂)和配置。 使用共享配置和工厂,您至少可以生产相同的 bean(不需要相同,但对您来说似乎足够了)。

  2. 定义在所有应用程序之间共享的JNDI 资源 当然,这要求 Tomcat 可以访问您的类,因此您首先必须通过选项 1。这样您就可以“发布”在所有应用程序之间共享的类的实例 可以在JNDI 资源 HOW-TO 中找到详细信息。 通过这种方法,您可以使用@Resource注释注入已发布的资源。

  3. 创建一个可以为您提供数据和功能并从您的应用程序访问它的微服务(如其他答案之一所示)。 这为您提供了最大的灵活性,但也带来了需要与微服务进行实际通信的复杂性。

显然,选项 1 和 2 需要直接访问服务器配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM