Что такое bean
Bean в контексте Spring — это объект, жизненным циклом которого управляет контейнер Spring IoC (Inversion of Control). Контейнер создает, инициализирует, связывает и уничтожает бины, а также внедряет зависимости между ними. Бины являются основными строительными блоками приложения на Spring: это могут быть контроллеры, сервисы, репозитории, компоненты доступа к данным, конфигурационные классы и другие объекты, которые образуют логику приложения.
Как объявляются бины
Самый распространенный способ — использовать стереотипные аннотации на классах. Spring автоматически сканирует пакеты и регистрирует аннотированные классы как бины.
@Component— универсальная аннотация для любого Spring-компонента.@Service— для сервисного слоя (бизнес-логика).@Repository— для слоя доступа к данным (DAO).@Controller— для веб-контроллеров (MVC).
Пример бина, объявленного через @Service:
@Service
public class MyService {
public String sayHello() {
return "Hello, Spring!";
}
}После запуска контекста Spring обнаружит MyService и создаст его экземпляр. Этот экземпляр можно внедрять в другие бины через конструктор, сеттер или поле.
Также бины можно объявлять явно:
- В XML-конфигурации с помощью элемента
<bean>. - В Java-конфигурации с помощью аннотации
@Beanна методах конфигурационного класса.
Внедрение зависимостей
Контейнер Spring автоматически внедряет зависимости в бины. Это уменьшает связанность между компонентами и упрощает тестирование: вместо ручного создания зависимостей вы просто объявляете их, а Spring заботится об остальном.
@Service
public class OrderService {
private final PaymentService paymentService;
// Внедрение через конструктор — рекомендуемый способ
public OrderService(PaymentService paymentService) {
this.paymentService = paymentService;
}
}Здесь PaymentService будет автоматически найден и передан в конструктор OrderService.
Жизненный цикл бина
Spring управляет полным жизненным циклом бина: создание, инициализация, использование и уничтожение. Можно настроить поведение на каждом этапе с помощью аннотаций @PostConstruct (после инициализации) и @PreDestroy (перед уничтожением). Также можно реализовать интерфейсы InitializingBean и DisposableBean.
@Component
public class MyBean {
@PostConstruct
public void init() {
// логика после создания и внедрения зависимостей
}
@PreDestroy
public void cleanup() {
// логика перед уничтожением бина
}
}Подводные камни
- Скоуп бинов: по умолчанию бины — синглтоны (один экземпляр на контейнер). Для других скоупов используйте
@Scope(например,prototype— новый экземпляр при каждом запросе). - Циклические зависимости: если два бина ссылаются друг на друга, Spring может не разрешить их. Решение — рефакторинг или использование
@Lazy. - Сканирование пакетов: убедитесь, что аннотированные классы находятся в пакетах, которые сканирует Spring (обычно это пакет, где расположен класс с
@SpringBootApplication).
Коротко
- Bean — это объект, управляемый Spring IoC-контейнером.
- Объявляется через аннотации (
@Component,@Service,@Repository,@Controller) или явно в XML/Java-конфигурации. - Контейнер автоматически внедряет зависимости, что снижает связанность и упрощает тестирование.
- Жизненный цикл бина управляется контейнером: можно задать логику инициализации и уничтожения.