@Configuration
предназначен для указания bean-компонентов, например:
@Configuration
public class MyMongoConfiguration {
@Bean
public MongoTemplate mongoTemplate() {
return new ...
}
@Bean
public MySampleBean mySampleBean(MongoTemplate tpl) {
return new MySampleBean(tpl);
}
}
Но если так, то зачем вам вообще работать с @Component
(по крайней мере для создаваемых bean-компонентов)?Конфигурация - это специальный bean-компонент, используемый средой Spring для загрузки других bean-компонентов, и его можно рассматривать как «замену» / альтернативный метод сканирования компонентов.
Я считаю, что если у вас есть какая-то инфраструктурная конфигурация, которая загружает кучуЧто касается «инфраструктурных компонентов» (совместно используемый jar, если я правильно понял), то службы, использующие этот jar, должны только сказать «Эй, я хочу загрузить эту конфигурацию», а не сканировать внутри структуры упаковки этого jar.Почему я так думаю?
- Что если вы решите добавить новые bean-компоненты в новый пакет в инфра-инфраструктуре, должны ли внешние службы изменить свой код и определить дополнительную папку для сканирования?- Вероятно, не.
- Что если вы решите переместить инфра в другой пакет?
Теперь в Spring есть два простых способа сделать это:
Способ 1: использовать аннотацию @Import
@Configuration // this is from "shared artifact"
class MyInfraConfiguration {
}
@Configuration // this is from an "applicative service" that uses the infra jar in dependencies
@Import(MyInfraConfiguration.class)
class ServiceAConfiguration {
}
Способ 2: использование механизма Spring Factories
Первый способ имеет недостаток: вам необходимо знать в службе, что такое инфраструктура.Если вы считаете это недостатком, рассмотрите возможность использования фабрики Spring.
фабрики Spring позволяют регистрировать инфраструктуру в каком-либо файле, чтобы Spring Boot автоматически загружал ее в служебную, вам даже не нужно будет упоминать MyInfraConfiguration
в конфигурации службы, просто добавьте зависимость к инфра-банке, и она будет работать.
В компоненте инфра создайте:
META-INF/spring.factories
и добавьте туда:
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.mycompany.myinfra.whatever.InfraConfiguration
Вот и все.Теперь, если вы хотите настроить загрузку bean-компонентов в инфраструктуре, например создание шаблонов, связанных с Mongo, только при наличии некоторых свойств, вы можете использовать @Conditional
.Теперь, хотя это и выходит за рамки данного вопроса, я упоминаю об этом, потому что в сочетании с пружинными фабриками это может создать очень гибкий способ управления вашими конфигурациями