java spring: 如何访问另一个 Spring 应用程序的应用程序上下文

java spring: how to access Application Context of another Spring Application

我有两个单独的 spring boot(Maven) 应用程序 ORAApp1 和 CASApp1。我在单独的云实例上有两个应用程序 运行。 在我的 CASApp1 中,我需要从 ORAApp1 的应用程序上下文中获取 bean。

想知道这是否可行,如果可行,如何实现。

谢谢, 阿图尔.

你的情况不可能。这里有 2 个不同的云实例,这意味着 2 个不同的 JVM 和 2 个不同的 spring 容器。

如果你想在你的应用程序中实例化多个ApplicationContexts。它将位于 parent-child 层次结构中。将有一个根 ApplicationContext,然后每个 DispatcherServlet 都会有几个 child ApplicationContext。应用程序的全局 Bean 将在根 ApplicationContext 中定义。所有 ApplicationContexts 将仅由单个 JVM 上的一个 spring 容器 运行 管理。

您不能直接从一个 spring 启动应用程序获取 beans 到另一个。

ApplicationContext 接口

The Spring IoC container is responsible for managing the objects of an application. It uses dependency injection to achieve inversion of control. The interfaces BeanFactory and ApplicationContext represent the Spring IoC container

Web 应用程序被容器化在 spring 中,您不能经常与不同的 applications/containers 共享变量。您可以在一个应用程序中有两个上下文如果您有两个上下文,每个上下文都有自己的单例。

解决方法:

您可以尝试使用与您用于在两个服务之间进行通信的相同机制。例如。休息 API

从应用程序上下文中获取 bean。

 @Bean
    public CommandLineRunner run(ApplicationContext appContext) {
        return args -> {

            String[] beans = appContext.getBeanDefinitionNames();
            Arrays.stream(beans).sorted().forEach(System.out::println);

        };
    }

Spring 引导应用程序不会公开 bean 以供其他应用程序使用,因此您不能真正这样做。 Spring 引导应用程序的设计是“self-contained”,bean 不是“公开服务”,而是实现应用程序业务逻辑的应用程序内部构建块。

这是所有 spring 应用程序的设计。

通常,Spring 是“存在于”JVM 中的东西,但是您 运行 两个不同的 JVM 进程,因此您必须在两者之间进行某种 inter-process 通信他们。

此外,“控制”其他应用程序可以使用哪些功能以及如何使用(协议、参数、结果等)也是一个好主意。

幸运的是 spring 引导应用程序允许使用 spring-MVC 的控制器轻松建立此类控制。所以基本上你用几个注释标记一个 bean(bean = a class managed by spring 并允许注入其他 spring bean)并且它被暴露(由一些 URL) 自动地。这是实现您想要的最接近“spring-ish”的方式。

当然,如果您需要 GRPC 风格的 inter-process 通信,您绝对可以创建 GRPC 服务。

还有其他方法可用于不同的用例(例如,您可能会选择 JMX 进行管理)或用于异步通信的某种消息总线,但这个话题太宽泛,无法在一个问题。最重要的是,这不是“自动”的,您必须选择适合您情况的 IPC 样式,但绝对需要 something 并且您不能只是“调用" 只要您有两个不同的应用程序 运行 在两个不同的 JVM 上(它们是否 运行 是否在同一主机上并不重要)。