«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Внедрение зависимостей в Spring Boot: мастер за кулисами

Внедрение зависимостей в Spring Boot: мастер за кулисами

Опубликовано 9 ноября 2024 г.
Просматривать:298

Dependency Injection in Spring Boot: The Wizard Behind the Curtain

Внедрение зависимостей в Spring Boot: мастер за кулисами

Вы когда-нибудь чувствовали, что Spring Boot — это волшебный дворецкий, который каким-то образом просто знает, что вам нужно, и преподносит вам это на серебряном блюде? По сути, это Внедрение зависимостей (DI). Вы, вероятно, использовали DI сотню раз, не задумываясь: Как, черт возьми, Spring знает, что и когда внедрять?

Если это похоже на вас, добро пожаловать на борт! Мы собираемся совершить увлекательную экскурсию за кулисы того, как DI Spring Boot работает со своим волшебством, начиная с того, как он управляет bean-компонентами, @Autowired и жизненными циклами bean-компонентов — от рождения до уничтожения. К концу этого блога вы сможете применить свои новые знания в области DI как профессионал.


Что такое внедрение зависимостей? И почему вас это должно волновать?

С точки зрения непрофессионала, внедрение зависимостей похоже на доставку продуктов к вашей двери вместо того, чтобы идти покупать их самостоятельно. Речь идет о делегировании ответственности за «внедрение» зависимостей (компонентов) Spring, чтобы вам не приходилось вручную создавать объекты или беспокоиться об их жизненном цикле.

Представьте, что вы шеф-повар и управляете загруженной кухней (ваше приложение). У вас нет времени бежать и собирать яйца, молоко и сахар каждый раз, когда они вам нужны. Разве не было бы здорово, если бы кто-нибудь (скажем, Spring) просто волшебным образом доставил все, что вам нужно, именно тогда, когда вам это нужно?

Именно это делает Spring DI: он находит все необходимые вам ингредиенты (компоненты) и внедряет их в ваш код, даже не поднимая пальца. Довольно аккуратно, правда?


Магия Spring Container: ваш личный дворецкий

Хорошо, вот где происходит волшебство. Когда вы запускаете приложение Spring Boot с помощью SpringApplication.run(), Spring загружает ApplicationContext — думайте об этом как об инструкции вашего дворецкого. Он точно знает, что и когда получить.

Давайте разберем это шаг за шагом:

  1. Инициализация контейнера: Когда вы нажимаете SpringApplication.run(), контейнер Spring (он же ApplicationContext) начинает действовать. Это как открыть двери виртуального ресторана, где все готово.

  2. Создание компонента: Контейнер сканирует ваш код на наличие аннотаций, таких как @Component, @Service, @Repository или @Controller. Каждый из них становится компонентом — объектом, управляемым Spring. Думайте о них как об основных ингредиентах на вашей кухне: мука, сахар, яйца и т. д.

  3. BeanFactory спешит на помощь: Spring Boot использует BeanFactory для создания и управления этими bean-компонентами. Эта фабрика точно знает, как и когда создавать ваши бобы, и гарантирует, что они будут доступны, когда это необходимо.

  4. Внедрение зависимостей: Как только bean-компоненты готовы, Spring внедряет их туда, где вы отметили @Autowired. Это как иметь бариста, который не просто варит кофе, но и доставляет его именно на ту стойку, куда он нужен. Вам даже не нужно об этом думать — все просто появляется.


Как работает @Autowired? Шерлок Холмс из Бинс

Ах, старая добрая аннотация @Autowired. Вы когда-нибудь задумывались, каким образом Spring волшебным образом знает, куда вставлять зависимости? Это что-то вроде детектива, который подбирает под ваши нужды нужные компоненты в своем реестре.

Вот как это работает:

  • Сопоставление типов: Когда Spring видит @Autowired, он ищет bean-компонент того же типа в контейнере. Представьте, что вы заказали кофейные зерна (класс CoffeeService), Spring просматривает свой репозиторий зерен и говорит: «А, они у меня есть! Позвольте мне ввести их вам».

  • Квалификаторы: Но что, если у вас есть несколько bean-компонентов одного типа? В этом случае Spring может взбеситься и выдать исключение типа «NoUniqueBeanDefinitionException». Но не волнуйтесь — вы можете успокоить Spring, используя @Qualifier, чтобы указать, какой компонент нужно внедрить:

@Autowired
@Qualifier("espressoBean")
private CoffeeService coffeeService;
  • Внедрение в конструктор (лучший способ): В наши дни внедрение в конструктор — это крутая штука на свете. Это не только делает ваши bean-компоненты неизменяемыми, но и упрощает тестирование. Вот как это сделать:
public class CoffeeShop {

    private final CoffeeService coffeeService;

    @Autowired
    public CoffeeShop(CoffeeService coffeeService) {
        this.coffeeService = coffeeService;
    }
}

Spring работает на автопилоте, внедряя компоненты в конструктор, и вуаля — все готово!


Жизненный цикл весеннего боба: от рождения до выхода на пенсию

Бобы в Spring Boot — это не просто объекты. У них полноценная жизнь, полная истории происхождения, успешной карьеры и возможного выхода на пенсию. Давайте проследим за жизненным циклом компонента:

  1. Реализация (рождение): Сначала Spring создает экземпляр компонента. Это похоже на рождение боба. Весна говорит: «Вот, малыш!» и передает его в контейнер.

  2. Внедрение зависимостей: После создания компонента Spring заполняет его зависимостями (например, ингредиентами в рецепте торта). Здесь в игру вступает @Autowired. Ваш компонент получает все необходимое для правильной работы.

  3. Пост-инициализация: Если у вас есть методы, аннотированные @PostConstruct, Spring вызывает их после внедрения зависимостей. Это все равно, что дать бобу свежий слой краски, прежде чем он приступит к работе.

  4. Готов к действию: Теперь ваш компонент жив и здоров. Он готов покорить мир!

  5. Предварительное уничтожение (удаление): Когда приложение завершает работу, Spring вызывает методы @PreDestroy, чтобы обеспечить корректный выход компонента. Это вечеринка по случаю выхода на пенсию компонента, на которой он очищает свои ресурсы.

  6. Уничтожение компонента: Наконец, компонент уничтожается. Время покоиться с миром.

Вот как можно отслеживать эти события жизненного цикла в коде:

@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!");
    }
}

Bean Scopes: как долго длится волшебство?

Не все бобы имеют одинаковую продолжительность жизни. Spring Boot позволяет вам определять различные области действия для компонентов — в основном, как долго они живут. Двумя наиболее распространенными из них являются:

  • Singleton (по умолчанию): Существует только один экземпляр компонента, общий для всего приложения. Это как иметь одну эспрессо-машину на всю кофейню.

  • Прототип: Новый экземпляр компонента создается каждый раз, когда это необходимо. Представьте себе, что для каждого заказа у вас есть машина для свежего эспрессо. Это ресурсоемко, но иногда необходимо.

@Component
@Scope("prototype")
public class LatteMachine {
    // This bean is made fresh for every use
}

SpringApplication.run(): гроссмейстер DI

Хорошо, давайте поговорим о том, что происходит, когда вы запускаете приложение Spring Boot с помощью SpringApplication.run(). Этот метод является гроссмейстером, с которого начинается весь процесс внедрения зависимостей.

  1. Запуск контекста приложения: Spring запускает ApplicationContext, где живут все компоненты.
  2. Сканирование компонентов: Spring сканирует ваш код на наличие компонентов и регистрирует их.
  3. Внедрение зависимостей: Как только bean-компоненты готовы, Spring начинает внедрять их везде, где используется @Autowired.
  4. Запустите приложение: Как только все будет готово, приложение заработает. Магия завершена.

Аналогия из реальной жизни: DI в кофейне

Думайте о своем приложении Spring Boot как о кафе. Вы владелец, а зерна — это ваши ингредиенты: кофе, молоко, сахар и т. д. Вместо того, чтобы самому бегать по этим ингредиентам, у вас есть бариста (контейнер Spring), который все приносит и доставляет именно туда, куда нужно. нужный.

Все, что вам нужно сделать, это отдать заказы (настроить поля @Autowired), а бариста сделает все остальное — идеально приготовит чашку кофе, наполненную зависимостями, для ваших клиентов (приложение).


Подведем итоги: DI — ваша суперсила

В конце концов, Внедрение зависимостей — это то, что делает Spring Boot таким мощным фреймворком. Он упрощает вашу жизнь, управляет компонентами и обеспечивает простоту обслуживания и расширения вашего кода.

Теперь, когда вы заглянули за кулисы, у вас появилась суперсила, которую многие разработчики считают само собой разумеющейся. Так что вперед — начните использовать DI, как тот волшебник, которым вы сейчас являетесь. И в следующий раз, когда вы увидите @Autowired, вы будете точно знать, что происходит под капотом.


Надеюсь, этот блог дал вам более глубокое понимание Spring Boot DI и оставил у вас улыбку. А теперь введите немного бобов и покажите своим друзьям, как это делается!


Как вам такой интересный, информативный и понятный блог? Дайте мне знать, если вам нужны еще изменения!

Заявление о выпуске Эта статья воспроизведена по адресу: https://dev.to/janisyed18/dependent-injection-in-spring-boot-the-wizard-behind-the-curtain-49n8?1 В случае каких-либо нарушений, пожалуйста, свяжитесь с Study_golang@163. .com, чтобы удалить его
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3