簡體   English   中英

Spring boot:配置繼承

[英]Spring boot : configuration inheritance

我有

package com.parent.spring;
public abstract class ParentConfig {

@Bean
public String bParent() {
   return "parent bean";
}

然后

package com.child.spring;
public class ChildConfig extends ParentConfig {
  @Bean
  public String bChild() {
     return "child bean";
  }
}

這是我如何啟動 Spring Boot 應用程序

@SpringBootApplication
@ComponentScan(basePackages = { "com.child.spring","com.parent.spring" })
public class MyMain {
    public static void main(String args[]) throws Exception {
        SpringApplication.run(MyMain.class, args);
    }
}

我想先從子配置加載 bean,然后從父配置加載 bean。 然而,相反的情況正在發生。 不想使用取決於選項,因為這只是一個例子,實際上我在子級和父級配置中有很多 bean。 另外,我在父包中有很多其他配置類,所以我不想從組件掃描中刪除它。 對此有更好的解決方案嗎?

我想先從子配置加載 bean,然后從父配置加載 bean。

你想向框架解釋如何做它的工作?
Spring Configuration和更一般的 Spring bean 以 Spring 認為滿足所有依賴項要求的正確順序加載和添加到上下文中。
此外,配置繼承沒有被記錄為實現這種事情的一種方式。
明確指定特定 bean 的順序是可能的,但它應該是例外而不是規范,而您似乎想要將該例外作為規范。

您能否解釋更多您的用例,以便我們可以為您提供最佳解決方案:)?

一般來說,將@Configuration文件視為常規 java 類並使用 java 的所有功能作為此文件中代碼的語言是一種錯誤的方法。 你提到了繼承,那么復雜的 if 條件、循環、遞歸,任何人呢? :) 我的觀點是,您真的不想在配置中得到復雜的代碼並對其進行調試。

現在關於繼承本身。 這不是一個好主意,因為考慮到它不是一個常規的 java 類,再加上對 spring 如何使用這些配置文件的理解,你會明白配置在這里沒有任何意義。 將配置視為您聲明應加載哪些 bean 的地方。 Spring 會處理剩下的事情。 我確實理解您有一些用例,但它根本不適合 Spring 方法。

至於你的說法:

我想先從子配置加載 bean,然后從父配置加載 bean。

你能解釋一下你為什么需要這個嗎? 當 spring 加載時,它首先掃描所有配置但不創建 bean (還沒有)。 相反,它將在這些@Configuration類中找到的信息“翻譯”為“元數據”(這在 spring 中稱為“Bean 定義”)。 來自所有配置的所有 bean 定義....

只有在 Spring 開始 bean 實例化之后(此時它也知道應該首先創建哪個 bean,例如,如果您有類似的東西):

class A {
   private B b;
   public A(B b) {this.b = b;}   
 }

class B {
   ....
}

那么很明顯Spring應該首先創建Bean“B”。

暫無
暫無

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

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