В чем разница между @ComponentScan и @EnableAutoConfiguration в Spring Boot?
В чем разница между аннотациями @ComponentScan
и @EnableAutoConfiguration
в Spring Boot? Нужно ли добавлять их? Мое приложение работает очень хорошо без этих аннотаций. Я просто хочу понять, почему мы должны их добавлять.
Ответы
Ответ 1
В чем разница между @ComponentScan и @EnableAutoConfiguration аннотации в Spring Загрузка?
@EnableAutoConfiguration
аннотация указывает Spring "Угадать", чтобы "угадать", как вы хотите настроить Spring, на основе зависимостей jar что вы добавили. Например, если HSQLDB находится в вашем пути к классам, и вы не настроили вручную соединение с базой данных beans, тогда Spring будет автоматически настраивать базу данных в памяти.
@ComponentScan
сообщает Spring искать другие компоненты, конфигурации и службы в указанном пакете. Spring способен автоматически сканировать, обнаруживать и регистрировать ваш beans или компоненты из заранее определенного пакета проекта. Если пакет не указан, то текущий пакет классов принимается как корневой пакет.
Нужно ли добавлять эти?
Если вам нужна Spring boot для автоматической настройки каждой вещи для вас @EnableAutoConfiguration требуется. Вам не нужно добавлять его вручную, Spring добавит его внутренне для вас на основе предоставленной вами аннотации.
Фактически аннотация @SpringBootApplication
эквивалентна использованию @Configuration, @EnableAutoConfiguration
и @ComponentScan
с их атрибутами по умолчанию.
См. также:
Ответ 2
Одним из основных преимуществ Spring Boot является его аннотация по сравнению с традиционными конфигурациями на основе xml, @EnableAutoConfiguration автоматически настраивает приложение Spring на основе его включенных файлов jar, оно устанавливает значения по умолчанию или помощник на основе зависимостей в pom.xml.
Автоматическая настройка обычно применяется на основе пути к классам и определенного beans. Поэтому нам не нужно определять какие-либо из DataSource, EntityManagerFactory, TransactionManager и т.д. И магически на основе пути к классам, Spring Boot автоматически создает правильный beans и регистрирует их для нас. Например, если в вашем пути к классам есть tomcat-embedded.jar, вам, вероятно, понадобится TomcatEmbeddedServletContainerFactory (если вы не определили свой собственный EmbeddedServletContainerFactory bean). @EnableAutoConfiguration имеет атрибут exclude, чтобы явно отключить автоконфигурацию, иначе мы можем просто исключить его из pom.xml, например, если мы хотим, чтобы Spring настраивал tomcat, тогда исключить spring -bootstarter-tomcat из spring -boot-стартер-веб.
@ComponentScan предоставляет область для проверки компонентов Spring, она просто идет через предоставленный базовый пакет и берет зависимости, требуемые @Bean или @Autowired и т.д. В типичном Spring application, @ComponentScan используется в классах конфигурации, которые аннотируются с @Configuration. Классы конфигурации содержат методы, аннотированные с помощью @Bean. Эти аннотированные методы @Bean генерируют beans, управляемый контейнером Spring. Эти beans будут автоматически обнаружены аннотацией @ComponentScan. Есть несколько аннотаций, которые делают beans автоматически определяемым, например @Repository, @Service, @Controller, @Configuration, @Component.
В приведенном ниже коде Spring начинается сканирование из пакета, включая класс BeanA.
@Configuration
@ComponentScan(basePackageClasses = BeanA.class)
@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class})
public class Config {
@Bean
public BeanA beanA(){
return new BeanA();
}
@Bean
public BeanB beanB{
return new BeanB();
}
}