В чем разница между @Configuration и @Component весной?

@ComponentScan создает компоненты с использованием @Configuration и @Component. Обе эти аннотации отлично работают при обмене данными. В чем же тогда разница?

Ответы

Ответ 1

@Configuration Указывает, что класс объявляет один или несколько методов @Bean и может обрабатываться контейнером Spring для генерации определений bean-компонентов и запросов на обслуживание для этих компонентов во время выполнения

@Component Указывает, что аннотированный класс является "компонентом". Такие классы рассматриваются как кандидаты на автоматическое обнаружение при использовании конфигурации на основе аннотаций и сканирования пути к классам.

@Конфигурация мета-аннотируется с @Component, поэтому классы @Configuration являются кандидатами на сканирование компонентов

Вы можете увидеть больше здесь

http://docs.spring.io/spring-framework/docs/4.0.4.RELEASE/javadoc-api/org/springframework/context/annotation/Configuration.html

@Конфигурация также является @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

См. Https://docs.spring.io/spring-framework/docs/4.0.4.RELEASE/javadoc-api/org/springframework/context/annotation/Configuration.html.

Ответ 5

@Component импортируется по умолчанию с @Configuration. контроллеры, сервис и репозиторий являются дочерними компонентами (вместе с конфигурацией). Они также являются кандидатами на автоопределение.

Ответ 6

Помимо различий, отмеченных reos.

Причина, по которой @Configuration не может быть заменена на @Component, такова:

Разница заключается в том, как обрабатывается зависимость между компонентами. См. Ссылку для подробного объяснения с примером: Разница между конфигурацией и компонентом