我有兩個單獨的 spring boot(Maven) 應用程式 ORAApp1 和 CASApp1。我有兩個應用程式在單獨的云實體上運行。在我的 CASApp1 中,我需要從 ORAApp1 的應用程式背景關系中獲取 bean。
想知道這是否可能,如果可以,如何做到。
謝謝,阿圖爾。
uj5u.com熱心網友回復:
在你的情況下這是不可能的。這里有 2 個不同的云實體,這意味著 2 個不同的 JVM 和 2 個不同的 spring 容器。
如果您想ApplicationContexts在應用程式中實體化多個。它將處于父子層次結構中。將有一個根,然后每個根ApplicationContext都會有幾個孩子。應用程式全域的 Bean 將在 root 中定義。所有這些都將由一個運行在單個 JVM 上的 spring 容器來管理。ApplicationContextDispatcherServletApplicationContextApplicationContexts
uj5u.com熱心網友回復:
Spring Boot 應用程式不會公開 bean 以供其他應用程式使用,因此您不能真正做到這一點。Spring Boot 應用程式在設計上是“自包含的”,bean 不是“公開的服務”,而是實作應用程式業務邏輯的應用程式的內部構建塊。
這是所有彈簧應用的設計。
一般來說,Spring 是“存在”在 JVM 中的東西,但是您運行兩個不同的 JVM 行程,因此您必須在它們之間進行某種行程間通信。
此外,“控制”哪些函式可以被其他應用程式使用以及如何使用(協議、引數、結果等)也是一個好主意。
幸運的是,spring boot 應用程式允許通過使用 spring-MVC 的控制器輕松建立這種控制。所以基本上你用幾個注釋標記一個bean(bean =一個由spring管理的類并允許注入其他spring bean)并且它會自動暴露(通過一些URL)。這是實作您想要的最接近的“彈簧式”方式。
當然,如果您需要 GRPC 風格的行程間通信,您絕對可以創建 GRPC 服務。
還有其他方法可以用于不同的用例(例如,對于管理,您可能會選擇 JMX)或某種用于異步通信的訊息總線,但這是一個太寬泛的主題,無法在一個問題中討論。最重要的是,這不是“自動”的,您必須選擇適合您情況的 IPC 樣式,但肯定的是,您需要有一些東西,只要您有兩個不同的,就不能只是“呼叫”bean在兩個不同的 JVM 上運行的應用程式(它們是否在同一主機上運行并不重要)。
uj5u.com熱心網友回復:
您不能直接將 bean 從一個 Spring Boot 應用程式獲取到另一個。
ApplicationContext 介面
Spring IoC 容器負責管理應用程式的物件。它使用依賴注入來實作控制反轉。介面 BeanFactory 和 ApplicationContext 代表 Spring IoC 容器
Web 應用程式在 Spring 中被容器化,您不能定期與不同的應用程式/容器共享變數。你可以在一個應用程式中有兩個背景關系如果你有兩個背景關系,每個背景關系都有自己的單例。
解決方法:
您可以嘗試使用與用于在兩個服務之間進行通信的相同機制。例如。REST API
從應用程式背景關系中獲取 bean。
@Bean
public CommandLineRunner run(ApplicationContext appContext) {
return args -> {
String[] beans = appContext.getBeanDefinitionNames();
Arrays.stream(beans).sorted().forEach(System.out::println);
};
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/425983.html
上一篇:${awsjavasdk.version}如何在POM中作業
下一篇:構建專案時低于杰克遜例外
