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

标签 java spring 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(有多个应用程序以相同的方式 Autowiring 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();
    }
}

最佳答案

我认为您的问题是关于在部署在同一网络服务器中的不同应用程序容器之间共享一个单例 Bean 的数据。
出于安全原因,这是不可能的。每个部署的应用程序都有自己的类加载器,因此无法轻松访问驻留在其他容器内存中的 bean。
我建议您添加一个由不同部署的应用程序访问的微服务并使用它。它可以通过例如 OpenFeign 作为客户端轻松访问,如果操作正确,它几乎看起来像一个带有 getter 和 setter 的 bean。

关于java - 如何注册可以被多个WAR共享的bean(Spring boot + Tomcat),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69639841/

相关文章:

java - "Extending"实例创建后的匿名类

java - jOOQ记录中的错误字段

spring - 使用Querydsl仅选择Spring中的特定列?

java - Spring 数据 "Data too long for column at row"

java - 如何在基于 CDT 的 eclipse 调试器中更改线程组显示中的文本?

java - 从父函数/作用域访问子属性

java - 测试 Spring - 无模拟的 REST API

java - 在特定gradle任务上设置调试JVM args

java - 空指针异常 : null when trying to use jdbcTemplete

java - 获取经过身份验证的用户