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.