Spring несколько классов @Configuration

Я использую аннотацию Spring @Configuration для настройки своего приложения.

В настоящее время у меня есть один класс @Configuration, в котором объявлены все мои bean-компоненты. Поскольку количество бобов растет (более 30), я хочу разделить его на несколько классов.

Некоторые бины используют общие классы (в основном служебные классы):

Foo.class - это служебный класс Bar.class и Baz.class используют Foo.class

Я хочу иметь все Foo, Bar and Baz в трех разных классах @Configuration (соответственно Conf1, Conf2 and Conf3)

Проблема в том, что у меня нет доступа к экземпляру Conf1 из Conf2 and Conf3:

Conf1.class

@Configuration 
public class Conf1 {
    @Bean
    public Foo foo() {
        return new Foo();
    }
}

Conf2.class

@Configuration 
public class Conf2 {
    @Bean
    public Bar bar() {
        Bar bar = new Bar();
        bar.setFoo(conf1.foo()); // Not possible !
        return bar;
    }
}

Conf3.class

@Configuration 
public class Conf3 {
    @Bean
    public Baz baz() {
        Baz baz = new Baz();
        baz.setFoo(conf1.foo()); // Not possible !
        return baz;
    }
}

Есть идеи, как решить эту проблему?

Ответ 1

Вы должны иметь возможность автоупроверить их:

@Configuration 
public class Conf2 {
    @Autowired
    Conf1 conf1;
    ...
}

В качестве альтернативы вы можете autwire beans вместо конфигурации:

@Configuration 
public class Conf2 {
    @Autowired
    Foo foo;
    ...
}

Ответ 2

@Configuration
@Import({ DataSourceConfig.class, TransactionConfig.class })
public class AppConfig extends ConfigurationSupport {
      // bean definitions here can reference bean definitions in DataSourceConfig or TransactionConfig
}

Ответ 3

Spring Framework глава-5 объяснила это очень хорошо.

  • @ExternalBean: один класс конфигурации, возможно, должен ссылаться на bean-компонент, определенный в другом классе конфигурации (или, в этом отношении, в XML). Аннотация @ExternalBean предоставляет именно такой механизм. Когда JavaConfig встречает метод, аннотированный как @ExternalBean, он заменяет это определение метода поиском в фабрику включающего компонента для компонента с тем же именем, что и имя метода

  • @Import: @Import представляет JavaConfig-эквивалент элемента конфигурации XML. Один класс конфигурации может импортировать любое количество других классов конфигурации, и их определения компонентов будут обрабатываться так, как если бы они были определены локально

  • ConfigurationSupport: для удобства классы @Configuration могут расширять ConfigurationSupport, в первую очередь, для облегчения поиска bean-компонентов в прилагаемом BeanFactory/ApplicationContext.