Загружаем изображение…

🍃 Spring Boot: Магия или Логика? (IoC & Beans)



Когда вы запускаете Spring-приложение, происходит магия: все нужные объекты создаются сами, базы данных подключаются, сервер стартует.
Но за этой магией стоит четкий механизм - IoC Container (Inversion of Control / Инверсия управления).

📦 Что такое Application Context?

Представьте Spring как огромный завод.

🔴 Context (Контейнер) - это сам завод. Он управляет жизненным циклом объектов.
🔴 Bean (Бин) - это любая деталь (объект), которую этот завод создал и хранит у себя на складе.

Суть IoC:

🔴 Обычный подход: Вы сами управляете объектами (Service s = new Service()). Вы - главный.
🔴 Spring подход: Вы отдаете управление фреймворку. "Спринг, создай мне сервис и дай его, когда он понадобится". Spring - главный.

🏷 Как сделать Бин? (Аннотации)

Чтобы Spring узнал про ваши классы, их нужно пометить.

1. @Component — Самая базовая аннотация. "Эй, Спринг, это бин, управляй им!".
2. @Service - Тот же @Component, но семантически говорит: "Здесь бизнес-логика".
3. @Repository - Тот же @Component, но для работы с БД (ловит специфичные ошибки баз данных).
4. @Controller / @RestController - Для обработки HTTP-запросов.
5. @Configuration + @Bean - Используется, когда нужно создать бин из чужого класса (библиотеки), код которого вы не можете пометить аннотацией @Component.

💉 Dependency Injection (DI)

Главная фишка. Как один бин попадает внутрь другого?
Например, UserService нуждается в UserRepository.

❌ Способ 1: Через поле (Field Injection)

@Service
public class UserService {
@Autowired // ⚠️ Не рекомендуется!
private UserRepository repository;
}

Почему плохо: Невозможно протестировать (как подсунуть мок?), скрытые зависимости, возможен NullPointerException.

✅ Способ 2: Через конструктор (Constructor Injection)
Золотой стандарт современного Spring.

@Service
public class UserService {
private final UserRepository repository;

// @Autowired здесь не обязателен (в новых версиях Spring)
public UserService(UserRepository repository) {
this.repository = repository;
}
}

Плюсы: Поле final (неизменяемое), легко тестировать (можно передать любой репозиторий в конструктор), сразу видно все зависимости класса.

⚡ Лайфхак: Lombok

Чтобы не писать конструктор руками, используйте Lombok:

@Service
@RequiredArgsConstructor // Генерирует конструктор для final полей
public class UserService {
private final UserRepository repository; // Всё внедрится само!
}


🔥 Итог

Spring, это просто "мешок с объектами" (Context), которые он создает сам и связывает друг с другом (DI).

🔴 Забудьте про new Service().
🔴 Используйте внедрение через конструктор.
🔴 Помечайте классы правильными аннотациями (@Service, @Repository).

#SpringBoot #Java #IoC #DI #SpringTips

👉 @BookJava
Просмотры: 2 520
Открыть в MAX Сообщить о неточности

Репосты публикации

Публикация канала

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти