簡體   English   中英

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 它將處於父子層次結構中。 將有一個根ApplicationContext & 然后將有幾個子ApplicationContext分別對應於每個DispatcherServlet 應用程序的全局 bean 將在根ApplicationContext中定義。 所有ApplicationContexts將僅由一個運行在單個 JVM 上的 spring 容器管理。

您不能直接將 beans 從一個 spring 引導應用程序獲取到另一個。

ApplicationContext 接口

Spring IoC 容器負責管理應用程序的對象。 它使用依賴注入來實現控制反轉。 BeanFactory 和 ApplicationContext 接口代表 Spring IoC 容器

web 應用程序容器化在 spring 中,您不能定期與不同的應用程序/容器共享變量。 您可以在一個應用程序中有兩個上下文如果您有兩個上下文,每個上下文都有自己的 singleton。

解決方法:

您可以嘗試使用與用於在兩個服務之間進行通信的相同機制。 例如。 REST 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 引導應用程序的設計是“自包含的”,bean 不是“公開的服務”,而是實現應用程序業務邏輯的應用程序的內部構建塊。

這是所有 spring 應用程序的設計。

通常,Spring 是“存在”於 JVM 內部的東西,但是您運行兩個不同的 JVM 進程,因此您必須在它們之間進行某種進程間通信。

此外,最好“控制”其他應用程序公開使用哪些功能以及如何使用(協議、參數、結果等)。

幸運的是,spring 引導應用程序允許通過使用 spring-MVC 的控制器輕松建立此類控制。所以基本上,您用幾個注釋標記一個 bean(bean = spring 管理的 class,並允許注入其他 spring beans)並且它被暴露(由一些網址)自動。 這是實現您想要的最接近“彈簧式”的方式。

當然,如果您需要 GRPC 風格的進程間通信,您絕對可以創建 GRPC 服務。

還有其他方法可用於不同的用例(例如,您可能會選擇 JMX 進行管理)或用於異步通信的某種消息總線,但這是一個太寬泛的話題,無法在一個問題中討論。 最重要的是,這不是“自動”的,您必須選擇適合您情況的 IPC 樣式,但絕對需要有一些東西,只要您有兩個不同的 bean,就不能只“調用”bean在兩個不同的 JVM 上運行的應用程序(它們是否在同一主機上運行並不重要)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM