Ответ
Обе аннотации регистрируют объекты как бины в контексте 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 для программируемой конфигурации, особенно когда нужно работать с классами, исходный код которых вам не принадлежит.