@Bean в @Configuration и @Component. Разница?

Разница между аннотациями @Bean в классе, помеченном аннотацией @Configuration, и аннотацией @Component в классе заключается в их назначении и роли в контексте приложения на основе Spring Framework.

Аннотация @Component является базовой аннотацией для всех остальных аннотаций, используемых для создания компонентов в Spring Framework. Класс, помеченный @Component, считается компонентом и будет обнаружен и зарегистрирован в контексте приложения при помощи механизма автообнаружения компонентов Spring. Аннотация @Component можно использовать на классах любого типа, будь то классы модели, сервисы, репозитории и т.д.

Например, если у нас есть класс ProductService, который является сервисом, мы можем пометить его аннотацией @Component:

@Component
public class ProductService {
    //...
}

Когда контекст приложения будет поднят, Spring обнаружит класс ProductService и создаст его экземпляр в контексте.

Аннотация @Bean используется для явного определения бина в контексте Spring. Она может быть использована только на методах в классе, помеченном аннотацией @Configuration. Классы, помеченные аннотацией @Configuration, представляют конфигурацию приложения и содержат методы, которые конфигурируют и инициализируют компоненты.

Например, если у нас есть класс AppConfig, помеченный аннотацией @Configuration, и мы хотим создать бин ProductService, мы можем использовать аннотацию @Bean:

@Configuration
public class AppConfig {
    
    @Bean
    public ProductService productService() {
        return new ProductService();
    }
    
    //...
}

Когда контекст приложения будет поднят, Spring создаст экземпляр класса AppConfig и вызовет метод productService(). Результат этого метода будет зарегистрирован в контексте Spring как бин с именем "productService".

Используя аннотацию @Bean, мы можем настроить дополнительные атрибуты бина, такие как его область видимости, жизненный цикл и др. Кроме того, аннотация @Bean позволяет внедрять зависимости в метод, который создает бин.

Таким образом, основная разница между аннотацией @Bean в классе, помеченном аннотацией @Configuration, и аннотацией @Component в классе заключается в их назначении. Аннотация @Component используется для автообнаружения компонентов, в то время как аннотация @Bean используется для явного создания и настройки бинов в контексте приложения.