@ComponentScan создает компоненты с использованием @Configuration и @Component. Обе эти аннотации отлично работают при обмене данными. В чем же тогда разница?
В чем разница между @Configuration и @Component весной?
Ответ 1
@Configuration Указывает, что класс объявляет один или несколько методов @Bean и может обрабатываться контейнером Spring для генерации определений bean-компонентов и запросов на обслуживание для этих компонентов во время выполнения
@Component Указывает, что аннотированный класс является "компонентом". Такие классы рассматриваются как кандидаты на автоматическое обнаружение при использовании конфигурации на основе аннотаций и сканирования пути к классам.
@Конфигурация мета-аннотируется с @Component, поэтому классы @Configuration являются кандидатами на сканирование компонентов
Вы можете увидеть больше здесь
@Конфигурация также является @Component, но @Component не может действовать как @Cofinguration.
Ответ 2
На самом деле ответ не является полным, верно ли, что:
@Component Указывает, что аннотированный класс является "компонентом". Такие классы рассматриваются как кандидаты на автоматическое обнаружение при использовании конфигурации на основе аннотаций и сканирования пути к классам.
Но вы можете создать, т.е. Класс MyConfiguration.java, затем стереотип с @Component
и добавить к @Beans
объявление @Beans
. Таким образом, он будет выглядеть как конфигурация, основное отличие состоит в том, что при аннотированном классе с @Configuration
@Bean
аннотированные методы являются прокси-серверами, использующими CGLIB, которые выполняются в кодовых вызовах после того, как первый возвращает bean из контекста вместо метода execute снова и создает другой как это происходит при использовании @Component с @Bean
Ответ 3
@Configuration - это похоже на beans.xml, но конфигурация bean-компонентов на основе Java. Это означает, что класс, помеченный этой аннотацией, является местом, где настроены bean-компоненты, которые будут кандидатами на автоопределение. В этом классе методы аннотируются с помощью @Bean, которые возвращают объект класса.
Пример:
@Configuration
public class ConfigClass {
@Bean
public UserClass getObject() {
return new UserClass();
}
}
@Component - Вы не можете автоматически связывать (@Autowire) любой класс, если он не помечен @Component. Это означает, что если вы хотите автоматически связать любой класс с помощью аннотации, этот класс должен быть аннотирован @Component.
Пример:
@Component
public class A { .... }
public class B {
@Autowired
A a;
.....
.....
}
Весенний документ для справки: https://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/context/annotation/Configuration.html.
Ответ 4
Я однажды ошибочно использовал @Component
в одном из классов конфигурации и понял, что он работает так, как должен, с @Configuration
за исключением одного существенного отличия: если класс не в одном пакете и помечен @Component
, он должен быть помечен в @ComponentScan
для сканирования; в то время как если вы отметите тот же класс с @Configuration
, вам не нужно будет его отмечать, так как @Configuration
отмечает класс, который будет загружаться во время начальной загрузки.
Классы @Configuration могут не только загружаться с помощью сканирования компонентов, но также сами могут настраивать сканирование компонентов с помощью аннотации @ComponentScan
Ответ 5
@Component
импортируется по умолчанию с @Configuration
. контроллеры, сервис и репозиторий являются дочерними компонентами (вместе с конфигурацией). Они также являются кандидатами на автоопределение.
Ответ 6
Помимо различий, отмеченных reos.
Причина, по которой @Configuration не может быть заменена на @Component, такова:
Разница заключается в том, как обрабатывается зависимость между компонентами. См. Ссылку для подробного объяснения с примером: Разница между конфигурацией и компонентом