В чем разница между аннотациями @Bean и @Component в Spring? Когда использовать каждую?

«В чем разница между аннотациями @Bean и @Component в Spring? Когда использовать каждую?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Обе аннотации регистрируют объекты как бины в контексте Spring IoC, но предназначены для разных сценариев.

Критерий @Component (и его стереотипы: @Service, @Repository, @Controller) @Bean
Применение Аннотация на уровне класса. Аннотация на уровне метода внутри класса, помеченного @Configuration.
Контроль Spring создает экземпляр автоматически через рефлексию. Разработчик полностью контролирует логику создания экземпляра в методе.
Использование Для ваших собственных классов, которыми вы управляете. Для сторонних классов (из библиотек) или когда требуется сложная логика инициализации.

Пример использования @Component:

@Component // Spring сам создаст бин MyService
public class MyService {
    public void doWork() { ... }
}

Пример использования @Bean:

@Configuration
public class AppConfig {

    @Bean // Мы явно создаем и конфигурируем бин DataSource
    public DataSource dataSource() {
        HikariConfig config = new HikariConfig();
        config.setJdbcUrl("jdbc:mysql://localhost/db");
        config.setUsername("user");
        config.setPassword("pass");
        config.setMaximumPoolSize(10);
        return new HikariDataSource(config);
    }

    @Bean // Бин, зависящий от другого бина
    public MyService myService(DataSource dataSource) {
        return new MyService(dataSource);
    }
}

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