Внедрение зависимостей в Spring Boot: мастер за кулисами
Вы когда-нибудь чувствовали, что Spring Boot — это волшебный дворецкий, который каким-то образом просто знает, что вам нужно, и преподносит вам это на серебряном блюде? По сути, это Внедрение зависимостей (DI). Вы, вероятно, использовали DI сотню раз, не задумываясь: Как, черт возьми, Spring знает, что и когда внедрять?
Если это похоже на вас, добро пожаловать на борт! Мы собираемся совершить увлекательную экскурсию за кулисы того, как DI Spring Boot работает со своим волшебством, начиная с того, как он управляет bean-компонентами, @Autowired и жизненными циклами bean-компонентов — от рождения до уничтожения. К концу этого блога вы сможете применить свои новые знания в области DI как профессионал.
С точки зрения непрофессионала, внедрение зависимостей похоже на доставку продуктов к вашей двери вместо того, чтобы идти покупать их самостоятельно. Речь идет о делегировании ответственности за «внедрение» зависимостей (компонентов) Spring, чтобы вам не приходилось вручную создавать объекты или беспокоиться об их жизненном цикле.
Представьте, что вы шеф-повар и управляете загруженной кухней (ваше приложение). У вас нет времени бежать и собирать яйца, молоко и сахар каждый раз, когда они вам нужны. Разве не было бы здорово, если бы кто-нибудь (скажем, Spring) просто волшебным образом доставил все, что вам нужно, именно тогда, когда вам это нужно?
Именно это делает Spring DI: он находит все необходимые вам ингредиенты (компоненты) и внедряет их в ваш код, даже не поднимая пальца. Довольно аккуратно, правда?
Хорошо, вот где происходит волшебство. Когда вы запускаете приложение Spring Boot с помощью SpringApplication.run(), Spring загружает ApplicationContext — думайте об этом как об инструкции вашего дворецкого. Он точно знает, что и когда получить.
Давайте разберем это шаг за шагом:
Инициализация контейнера: Когда вы нажимаете SpringApplication.run(), контейнер Spring (он же ApplicationContext) начинает действовать. Это как открыть двери виртуального ресторана, где все готово.
Создание компонента: Контейнер сканирует ваш код на наличие аннотаций, таких как @Component, @Service, @Repository или @Controller. Каждый из них становится компонентом — объектом, управляемым Spring. Думайте о них как об основных ингредиентах на вашей кухне: мука, сахар, яйца и т. д.
BeanFactory спешит на помощь: Spring Boot использует BeanFactory для создания и управления этими bean-компонентами. Эта фабрика точно знает, как и когда создавать ваши бобы, и гарантирует, что они будут доступны, когда это необходимо.
Внедрение зависимостей: Как только bean-компоненты готовы, Spring внедряет их туда, где вы отметили @Autowired. Это как иметь бариста, который не просто варит кофе, но и доставляет его именно на ту стойку, куда он нужен. Вам даже не нужно об этом думать — все просто появляется.
Ах, старая добрая аннотация @Autowired. Вы когда-нибудь задумывались, каким образом Spring волшебным образом знает, куда вставлять зависимости? Это что-то вроде детектива, который подбирает под ваши нужды нужные компоненты в своем реестре.
Вот как это работает:
Сопоставление типов: Когда Spring видит @Autowired, он ищет bean-компонент того же типа в контейнере. Представьте, что вы заказали кофейные зерна (класс CoffeeService), Spring просматривает свой репозиторий зерен и говорит: «А, они у меня есть! Позвольте мне ввести их вам».
Квалификаторы: Но что, если у вас есть несколько bean-компонентов одного типа? В этом случае Spring может взбеситься и выдать исключение типа «NoUniqueBeanDefinitionException». Но не волнуйтесь — вы можете успокоить Spring, используя @Qualifier, чтобы указать, какой компонент нужно внедрить:
@Autowired @Qualifier("espressoBean") private CoffeeService coffeeService;
public class CoffeeShop { private final CoffeeService coffeeService; @Autowired public CoffeeShop(CoffeeService coffeeService) { this.coffeeService = coffeeService; } }
Spring работает на автопилоте, внедряя компоненты в конструктор, и вуаля — все готово!
Бобы в Spring Boot — это не просто объекты. У них полноценная жизнь, полная истории происхождения, успешной карьеры и возможного выхода на пенсию. Давайте проследим за жизненным циклом компонента:
Реализация (рождение): Сначала Spring создает экземпляр компонента. Это похоже на рождение боба. Весна говорит: «Вот, малыш!» и передает его в контейнер.
Внедрение зависимостей: После создания компонента Spring заполняет его зависимостями (например, ингредиентами в рецепте торта). Здесь в игру вступает @Autowired. Ваш компонент получает все необходимое для правильной работы.
Пост-инициализация: Если у вас есть методы, аннотированные @PostConstruct, Spring вызывает их после внедрения зависимостей. Это все равно, что дать бобу свежий слой краски, прежде чем он приступит к работе.
Готов к действию: Теперь ваш компонент жив и здоров. Он готов покорить мир!
Предварительное уничтожение (удаление): Когда приложение завершает работу, Spring вызывает методы @PreDestroy, чтобы обеспечить корректный выход компонента. Это вечеринка по случаю выхода на пенсию компонента, на которой он очищает свои ресурсы.
Уничтожение компонента: Наконец, компонент уничтожается. Время покоиться с миром.
Вот как можно отслеживать эти события жизненного цикла в коде:
@Component public class CoffeeBean { @PostConstruct public void onStart() { System.out.println("Bean is ready to brew some coffee!"); } @PreDestroy public void onEnd() { System.out.println("Bean is retiring. Goodbye, world!"); } }
Не все бобы имеют одинаковую продолжительность жизни. Spring Boot позволяет вам определять различные области действия для компонентов — в основном, как долго они живут. Двумя наиболее распространенными из них являются:
Singleton (по умолчанию): Существует только один экземпляр компонента, общий для всего приложения. Это как иметь одну эспрессо-машину на всю кофейню.
Прототип: Новый экземпляр компонента создается каждый раз, когда это необходимо. Представьте себе, что для каждого заказа у вас есть машина для свежего эспрессо. Это ресурсоемко, но иногда необходимо.
@Component @Scope("prototype") public class LatteMachine { // This bean is made fresh for every use }
Хорошо, давайте поговорим о том, что происходит, когда вы запускаете приложение Spring Boot с помощью SpringApplication.run(). Этот метод является гроссмейстером, с которого начинается весь процесс внедрения зависимостей.
Думайте о своем приложении Spring Boot как о кафе. Вы владелец, а зерна — это ваши ингредиенты: кофе, молоко, сахар и т. д. Вместо того, чтобы самому бегать по этим ингредиентам, у вас есть бариста (контейнер Spring), который все приносит и доставляет именно туда, куда нужно. нужный.
Все, что вам нужно сделать, это отдать заказы (настроить поля @Autowired), а бариста сделает все остальное — идеально приготовит чашку кофе, наполненную зависимостями, для ваших клиентов (приложение).
В конце концов, Внедрение зависимостей — это то, что делает Spring Boot таким мощным фреймворком. Он упрощает вашу жизнь, управляет компонентами и обеспечивает простоту обслуживания и расширения вашего кода.
Теперь, когда вы заглянули за кулисы, у вас появилась суперсила, которую многие разработчики считают само собой разумеющейся. Так что вперед — начните использовать DI, как тот волшебник, которым вы сейчас являетесь. И в следующий раз, когда вы увидите @Autowired, вы будете точно знать, что происходит под капотом.
Надеюсь, этот блог дал вам более глубокое понимание Spring Boot DI и оставил у вас улыбку. А теперь введите немного бобов и покажите своим друзьям, как это делается!
Как вам такой интересный, информативный и понятный блог? Дайте мне знать, если вам нужны еще изменения!
Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.
Copyright© 2022 湘ICP备2022001581号-3