Контейнер Ioc
Тема дорожной карты · Spring Boot
Spring IoC-контейнер — это исполняемое ядро Spring Framework, управляющее полным жизненным циклом объектов приложения — называемых бинами — от создания экземпляра и внедрения зависимостей до уничтожения. В Spring Boot IoC-контейнер — это экземпляр ApplicationContext (как правило, AnnotationConfigServletWebServerApplicationContext для веб-приложений), который автоматически инициализируется через @SpringBootApplication и заполняется путём сканирования классов, аннотированных @Component, @Service, @Repository, @Controller и @Configuration. Spring IoC-контейнер разрешает и внедряет зависимости через @Autowired, инъекцию через конструктор или инъекцию через сеттер, реализуя принцип инверсии управления: бины объявляют, что им нужно, вместо того чтобы создавать это самостоятельно. Контейнер поддерживает богатую модель расширений: хуки BeanFactoryPostProcessor и BeanPostProcessor позволяют изменять определения бинов и их экземпляры при запуске, а колбэки жизненного цикла @PostConstruct / @PreDestroy вызываются на соответствующих фазах. Понимание Spring IoC-контейнера является необходимым условием для работы со всеми другими модулями Spring Boot — репозитории Spring Data JPA, цепочки фильтров Spring Security, компоненты Spring Cloud и реактивные пайплайны Spring WebFlux опираются на IoC-контейнер для связывания бинов и управления жизненным циклом.
Как это работает
Контейнер Ioc (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.
Типичные ошибки
Ловушки Контейнер Ioc: field injection (тяжело тестировать, скрывает constructor-зависимости); circular зависимости (Spring 3.x отклоняет по дефолту — фиксите дизайн); singleton-бины с mutable state (race conditions); @Autowired на non-final поле, переприсваиваемом позже (тихие баги).