Spring boot: наследование конфигурации - PullRequest
1 голос
/ 26 июня 2019

У меня

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";
  }
}

, и вот как я запускаю мое приложение для весенней загрузки

@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);
    }
}

Я хочу загрузить бобы от ребенкасначала конфиг и конфиг из родительского конфига.Однако происходит обратное.Не хочу использовать , зависит от опции , так как это всего лишь пример, в действительности у меня много компонентов в дочернем и родительском конфигурациях.Кроме того, у меня есть несколько других классов конфигурации в родительском пакете, поэтому я не хочу удалять это из сканирования компонентов.Любое лучшее решение на этот счет?

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Я хочу сначала загрузить бины из дочернего конфига и из родительского конфига.

Вы хотите объяснить каркасу, как выполнять его работу?
Spring Configurations и, в более общем смысле, компоненты Spring загружаются и добавляются в контексте в порядке, который Spring считает правильным удовлетворить все требования к зависимостям.
Кроме того, наследование конфигурации не документируется как способ достижения такой цели.
Указаниеявно порядок для определенных bean-компонентов возможен, но это должно быть исключением, а не нормой, хотя вы, похоже, хотите сделать это исключение нормой.

0 голосов
/ 27 июня 2019

Не могли бы вы подробнее объяснить ваш вариант использования, чтобы мы могли предоставить вам лучшее решение, которое мы можем :)?

В общем, неправильный подход к обработке файлов @Configuration как к обычным java-классам и использованию всей мощи java как языка для кода в этих файлах. Вы упоминаете наследование, как насчет сложных if-условий, циклов, рекурсии, кого-нибудь? :) Я хочу сказать, что на самом деле вы не хотите заканчивать сложным кодом в конфигурации и отлаживать его.

Теперь о самом наследовании. Это не очень хорошая идея, поскольку, учитывая тот факт, что это не обычный класс Java, в сочетании с пониманием того, как именно Spring использует эти файлы конфигурации, вы поймете, что конфигурация здесь вам ничего не дает. Думайте о конфигурациях как о месте, где вы указываете, какие компоненты должны быть загружены. Весна позаботится обо всем остальном. Я понимаю, что вы имеете в виду некоторый вариант использования, но он просто не подходит к подходу Spring.

Что касается вашего заявления:

Я хочу сначала загрузить бины из дочернего конфига и из родительского конфига.

Не могли бы вы объяснить, зачем вам это нужно? Когда пружина загружается, она сначала сканирует все конфигурации, но не создает бинов (пока нет). Вместо этого он «переводит» информацию, найденную в этих @Configuration классах, в «метаданные» (это называется «определения бинов» в терминах весны). Все определения bean-компонентов из всех конфигураций ....

Только после этого Spring запускает создание экземпляров bean-компонентов (к этому времени он также знает, какой bean-компонент должен быть создан первым, например, если у вас есть что-то вроде):

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

class B {
   ....
}

Тогда очевидно, что Spring должен сначала создать Бин "B".

...