@Configuration, @Bean
@Bean — способ зарегистрировать объект в Spring-контейнере вручную, когда @Component не подходит (например, для классов из внешних библиотек, которые ты не можешь пометить аннотацией сам).
@Configuration // класс с конфигурацией бинов
class AppConfig {
@Bean // метод создаёт и регистрирует бин
RestTemplate restTemplate() {
return new RestTemplate(); // класс из библиотеки Spring, нет доступа к его исходникам
}
@Bean
ObjectMapper objectMapper() {
ObjectMapper mapper = new ObjectMapper();
mapper.registerModule(new JavaTimeModule()); // ручная настройка перед регистрацией
return mapper;
}
}
Дальше этот бин можно внедрять как любой другой через @Autowired/конструктор.
Копнуть глубже
Когда выбирать @Bean, а когда @Component:
@Component | @Bean | |
|---|---|---|
| Где ставится | на сам класс | на метод в @Configuration-классе |
| Когда использовать | свой класс, есть доступ к коду | класс из внешней библиотеки, или нужна сложная настройка перед регистрацией |
| Гибкость | просто помечаешь класс | можешь написать любую логику создания объекта внутри метода |
@Bean-метод может зависеть от других бинов — просто принимает их как параметры метода:
@Bean
UserService userService(UserRepository repo, EmailValidator validator) {
return new UserService(repo, validator); // Spring сам подставит уже созданные бины
}
Это полезно, когда нужно настроить объект сложнее, чем просто @Component на класс позволяет.
🎤 Закрыл тему, если можешь объяснить:
• зачем нужен `@Bean`, если уже есть `@Component`;
• как `@Bean`-метод может зависеть от других бинов (если дошёл до 2-го слоя).
• как `@Bean`-метод может зависеть от других бинов (если дошёл до 2-го слоя).