Компонент Bean
Тема дорожной карты · Spring Boot
@Bean и @Component — два основных способа регистрации управляемых объектов в Spring IoC-контейнере Spring Boot-приложения. @Component (и его специализации @Service, @Repository и @Controller) — аннотация уровня класса, запускающая сканирование компонентов: Spring Boot автоматически обнаруживает аннотированный класс, когда @SpringBootApplication включает @ComponentScan для корневого пакета. @Bean, напротив, — аннотация уровня метода, размещаемая внутри класса @Configuration, которая даёт разработчикам полный программный контроль над созданием объекта — это полезно при настройке сторонних классов или когда логика создания нетривиальна. Оба — @Bean и @Component — создают бины, управляемые Spring-контейнером, с поддержкой внедрения через @Autowired, колбэков жизненного цикла (@PostConstruct, @PreDestroy) и AOP-проксирования. Правильный выбор между @Bean и @Component обеспечивает модульность Spring Boot-приложения: используйте @Component для своих классов и @Bean внутри @Configuration для инфраструктурных или интеграционных бинов, таких как DataSource, RestTemplate или ObjectMapper.
Как это работает
Компонент Bean (Dependency Injection + Inversion of Control): Spring-контейнер инстанцирует + связывает ваши бины вместо new везде. @Component (и стереотипы @Service, @Repository, @Controller) маркируют класс как Spring-managed bean; @Bean-методы в @Configuration-классе производят явные бины. @Autowired инжектит зависимости. Bean scopes (singleton дефолт, prototype, request, session) контролируют lifetime. Lifecycle hooks (@PostConstruct, @PreDestroy) запускают init/cleanup.
Когда применять
Предпочитайте constructor injection (final поля + @RequiredArgsConstructor через Lombok) — immutable, тестируемо, fail fast на отсутствующих зависимостях. Field/setter injection только для legacy. Бины stateless; singleton + state = concurrent-баги. Не инжектьте ApplicationContext чтобы "найти" бины — это service locator + ломает IoC.
Типичные ошибки
Ловушки Компонент Bean: field injection (тяжело тестировать, скрывает constructor-зависимости); circular зависимости (Spring 3.x отклоняет по дефолту — фиксите дизайн); singleton-бины с mutable state (race conditions); @Autowired на non-final поле, переприсваиваемом позже (тихие баги).