Весенний IOC? Прочтите эту статью, чтобы ознакомиться с принципом IoC

Spring

предисловие

Когда я впервые услышал про IoC, то подумал, что он очень высокий, но на самом деле принцип понять очень просто.

Следуйте по моим стопам и познакомьте вас с принципом IoC в одной статье.

Эта статья вращается вокруг того, что, почему и как:

Spring IoC?看这篇带你吃透 IoC 原理。

Знакомство с ИОК

Согласно тому, что мы сказали в предыдущей статье, все самые важные проекты в корзине семейства Spring основаны на Spring Framework, поэтому давайте возьмем Spring Framework в качестве примера, чтобы увидетьДокументация[2].

Прежде всего, справа от него есть ссылка на Github, и если вы нажмете «ИЗУЧИТЬ», вы увидите документацию каждой версии.

Spring IoC?看这篇带你吃透 IoC 原理。

Затем мы нажимаем «Ссылочный документ», чтобы увидеть введение некоторых его модулей:

(И т.д.; модуль? Что такое модуль? На этот вопрос ответы ниже.)

Spring IoC?看这篇带你吃透 IoC 原理。

Глава 1 Обзор, рассказывает историю, принципы проектирования и т.д.;

Вторая глава, Core, включает в себя контейнер IoC, AOP и т. д., которые, естественно, являются ядром Spring, так что зайдите и внимательно изучите.

Spring IoC?看这篇带你吃透 IoC 原理。

Нажав на кнопку, я нашел ценные учебные материалы, и здесь можно найти ответы на все вопросы, что, почему и как.

Spring IoC?看这篇带你吃透 IoC 原理。

Вот хорошее объяснение знаменитого IoC — инверсия управления, инверсия управления.

Кратко резюмирую: Inversion of Control — это передача процесса создания и управления bean-компонентами третьему лицу. И эта третья сторона — Spring IoC Container.Для IoC самое главное —контейнер.

Контейнер отвечает за создание, настройку и управление bean-компонентами, то есть он управляет жизнью bean-компонента и контролирует внедрение зависимостей bean-компонента.

С точки зрения непрофессионала, поскольку создавать объекты каждый раз в проекте очень хлопотно, мы используем контейнер Spring IoC для управления этими объектами, и вы можете использовать их напрямую, когда они вам нужны, независимо от того, как они появились или когда это необходимо. быть уничтожены, просто используйте его Достаточно.

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

Подождите, что такое фасоль?

Компонент на самом деле является обернутым объектом.Будь то инверсия управления или внедрение зависимостей, их субъект является объектом, а компонент — это объект, обернутый третьей стороной. (Подумайте о том, когда кто-то делает вам подарок, все они должны его упаковать, и вам не нужно делать его самостоятельно.

Бин — главный герой Spring.Есть поговорка, что Spring — это Bean-Oriented Programming (BOP).

IoC-контейнер

Поскольку контейнер — самая важная часть IoC, как Spring проектирует контейнер? Или вернитесь на официальный сайт, во втором абзаце есть введение:

Spring IoC?看这篇带你吃透 IoC 原理。

Ответ: Используйте ApplicationContext, который является подклассом BeanFactory, который лучше дополняет и реализует BeanFactory.

BeanFactory прост и груб и может быть понят как HashMap:

  • Key - bean name
  • Value - bean object

Но обычно он имеет только две функции get и put, поэтому его называют «контейнером низкого уровня».

А у ApplicationContext гораздо больше функций, поскольку он наследует несколько интерфейсов, его можно назвать «расширенным контейнером». Мы будем использовать его в проекте сборки ниже.

Spring IoC?看这篇带你吃透 IoC 原理。

В ApplicationContext есть два конкретных подкласса реализации, которые используются для чтения аксессуаров конфигурации:

  • ClassPathXmlApplicationContext — загружать файлы конфигурации из пути к классу, чаще используется;
  • FileSystemXmlApplicationContext - Загрузка конфигурационных файлов из локальных файлов встречается не очень часто.Если вы переходите в среду Linux, то приходится менять путь, что не очень удобно.

Когда мы нажимаем на ClassPathXmlApplicationContext, мы обнаруживаем, что он не наследует ApplicationContext напрямую, Он имеет много уровней зависимостей, и подклассы каждого уровня являются дополнительными реализациями родительского класса.

И взглянув вверх, я обнаружил, что класс верхнего уровня вернулся в BeanFactory, так что это очень важно.

Следует отметить, что в Spring также есть FactoryBean, Между ними нет особой связи, но имена относительно близки, так что не путайте порядок.

Чтобы лучше понять IoC, давайте сначала рассмотрим процесс написания кода без IoC.

Глубокое понимание IoC

Вот пример классического класса Rectangle:

  • Две переменные: длина и ширина
  • Автоматически генерировать метод set() и метод toString()

Примечание ⚠️: обязательно сгенерируйте метод set(), потому что Spring IoC внедряется через этот метод set(); метод toString() предназначен для облегчения печати и просмотра.

public class Rectangle {
    private int width;
    private int length;

    public Rectangle() {
        System.out.println("Hello World!");
    }


    public void setWidth(int widTth) {
        this.width = widTth;
    }

    public void setLength(int length) {
        this.length = length;
    }

    @Override
    public String toString() {
        return "Rectangle{" +
                "width=" + width +
                ", length=" + length +
                '}';
    }
}

Затем вручную используйте метод set() для присвоения значений переменным в тестовом файле.

Ну, собственно, это и есть процесс «развязки»!

public class MyTest {
  @Test
  public void myTest() {
    Rectangle rect = new Rectangle();
    rect.setLength(2);
    rect.setWidth(3);
    System.out.println(rect);
  }
}

По сути, это реализация метода IoC присваивания атрибутов свойствам, мы передаем «процесс создания объектов» в метод set(), вместо того, чтобы полагаться на new, чтобы создать его самостоятельно.

То, что я имею в виду под «создать самостоятельно», здесь относится к непосредственному созданию нового внутри объекта, что является положительным процессом программы, активно создающей объект; здесь используется метод set(), который был предоставлен мне кем-то другим ( test); и IoC — это метод set(), который на самом деле используется для создания и управления этими объектами в своем контейнере. Если вы мне не верите, можете ли вы попробовать удалить этот метод или изменить его имя?

Несколько ключевых вопросов:

Что такое контроль, что такое контроль?

Ответ: Это право на создание и управление бином, которое контролирует весь жизненный цикл бина.

Что такое реверс и что такое реверс?

Ответ: Дайте это право контейнеру Spring, вместо того, чтобы управлять им самостоятельно, оно будет обратным. Процесс активного создания объектов от предыдущего «я» к пассивному получению объектов, данных нам другими, является обратным.

Чтобы привести пример из жизни, активное инвестирование и пассивное инвестирование.

Люди, которые инвестируют в акции и сами выбирают акции, являются активными инвесторами, и инициатива находится в их руках, а те, кто покупает средства, являются пассивными инвесторами, и они передают инициативу управляющему фондом. инвестиции, которые вы должны выбрать?Продукты определяются управляющим фондом.

внедрение зависимости

Вернувшись в документацию, во втором предложении говорится: IoC также известен как DI.

Давайте поговорим о внедрении зависимостей — Dependency Injection.

Что такое зависимость, что такое зависимость?

Работа программы должна полагаться на внешние ресурсы для предоставления данных и ресурсов, необходимых объектам в программе.

Что такое инъекция, вводит что?

Файл конфигурации внедряет ресурсы снаружи внутрь, контейнер загружает внешние файлы, объекты и данные, а затем внедряет эти ресурсы в объекты в программе, поддерживая зависимости между объектами внутри и вне программы.

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

  • IoC — дизайнерская идея, DI — конкретная реализация;
  • IoC — это теория, DI — это практика;

Чтобы добиться развязки между объектами.

Конечно, IoC можно реализовать и другими способами, и DI — это просто выбор Spring.

IoC и DI не предлагаются фреймворком Spring, Spring просто применяет эту идею дизайна и концепцию к своему собственному фреймворку.

Зачем

Так зачем использовать идею IoC? Другими словами, какие преимущества может принести нам IoC?

Ответ: Развязка.

Он преобразует зависимости между объектами в файл конфигурации для управления, которым управляет Spring IoC Container.

В проекте базовая реализация состоит из множества объектов, и объекты взаимодействуют друг с другом для реализации бизнес-логики проекта. Однако многие-многие объекты тесно объединены, и как только возникает проблема с одной стороной, это неизбежно влияет на другие объекты, поэтому мы понимаем дизайнерскую идею лотоса.

Spring IoC?看这篇带你吃透 IoC 原理。

Spring IoC?看这篇带你吃透 IoC 原理。

Как показано на рисунке выше, ABCD первоначально связан друг с другом. После добавления управления сторонними контейнерами каждый объект связан с контейнером IOC третьего метода, и они больше не связаны друг с другом, И нет связи. Отношения, все объекты контролируются контейнером, что снижает близость этих объектов, которая называется «развязка».

как

Наконец, в практической части, давайте действительно создадим проект Spring и почувствуем его с помощью IoC.

Сейчас большинство из них используют maven для сборки проектов, что нам удобно для управления jar-пакетами, но я сначала расскажу о процессе ручного импорта jar-пакетов, посередине будет много проблем, которые являются хорошей возможностью для обучения.

Прежде чем мы начнем, давайте взглянем на следующую диаграмму — знаменитую диаграмму модуля Spring.

Восемь модулей Spring Framework

Spring IoC?看这篇带你吃透 IoC 原理。

Идея модульности — очень важная идея в Spring.

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

Каждый «зеленый ящик» соответствует модулю, всего 8 модулей; «черный пакет» указывает на пакет jar, который реализует этот модуль.

Core Container, который мы только что видели в документе, является контейнером IoC, ядром, и вы можете видеть, что он зависит от этих четырех пакетов jar:

  • Beans
  • Core
  • Context
  • SpEL, spring express language

Тогда мы знаем, что если вы хотите использовать функцию IoC, вам нужно импортировать эти 4 пакета jar. Среди них модуль Core является ядром Spring, от этого jar-пакета зависят все функции Spring, Core в основном реализует функцию IoC, так что, грубо говоря, все функции Spring реализованы посредством IoC.

Другие модули имеют мало общего с этой статьей и не будут здесь раскрываться.

Затем, когда мы хотим создать проект Spring, мы, конечно, можем импортировать все пакеты jar, но сможет ли ваш компьютер с этим справиться? . Но чем больше пакет и чем больше проект, тем больше проблем, поэтому старайтесь выбирать по мере необходимости, а не накапливать. .

Btw, 这张图在网上有很多,但是在我却没有在最新版的 reference doc 上找到。 .不过,既然那些老的教程里有,说明老版本的 doc 里有,那去Знакомство со старой версией [3]осмотреться

На первом изображении этой статьи, Spring Framework — Documentation, мы выбираем справочный документ 4.3.26, а затем ищем «Framework Modules». Конкретные ссылки см. в ссылках в конце статьи.

Есть еще один способ, о котором мы поговорим позже, когда будем говорить о содержимом пакета jar.

Соберите проект Spring

Если вы знаете, какие банки импортировать, поищите их.

Ручной режим загрузки JAR пакет

1. Скачать

ссылка для скачивания:

Spring IoC?看这篇带你吃透 IoC 原理。

Если вы хотите спросить меня, как я его нашел, это все еще из Справочного документа версии 4.3.26, и в начале есть Zip-файлы дистрибутива,

Spring IoC?看这篇带你吃透 IoC 原理。

Любопытство заставило меня открыть его и найти...

Spring IoC?看这篇带你吃透 IoC 原理。

Адрес склада найден!

Открыв его, я обнаружил, что это jar-пакет различных версий~

Мы ищем версию 5.2.3, которая находится внизу:

Spring IoC?看这篇带你吃透 IoC 原理。

Тогда вы можете использовать его с удовольствием

  • Dist.zip — это jar-пакет.
  • Docs.zip — это документация

Об остальном пока не беспокойтесь~

После загрузки внимательно посмотрите на подарочный пакет, который нам прислал Spring.

Вот ответ на оставшийся вопрос выше: где найти диаграмму инфраструктуры Spring Framework.

Ответ: скачанный docs.zip → spring-framework-reference → images → spring-overview

Spring IoC?看这篇带你吃透 IoC 原理。

Где находится пакет jar, который нам нужен для импорта Intellij? Dist.zip → библиотеки

Spring IoC?看这篇带你吃透 IoC 原理。

Как вы можете видеть здесь, каждый черный ящик соответствует 3 пакетам jar, и тот, который мы хотим импортировать в Intellij, называется RELEASE.jar.

2. Соберите проект без IoC

Давайте создадим новый проект без использования фреймворка maven, например, я назову его Spring_HelloWorld, а затем воспользуюсь примером моего часто используемого класса Rectangle.

Затем импортируйте пакеты jar, соответствующие четырем модулям, которые мы только что видели на диаграмме модулей во внешних библиотеках.Структура выглядит следующим образом:

Spring IoC?看这篇带你吃透 IoC 原理。

Как вы думаете, вы сделали с этим? Слишком молод, слишком прост

Запустим:

Spring IoC?看这篇带你吃透 IoC 原理。

Появился старый знакомый: no class def found error, то есть класс найти не удалось.

Мы используем общий журнал Google Maven, загружаем его пакет jar и добавляем его в проект.

Я уже добавил его на картинку выше, так что вы увидите файл commons-logging-1.2.

Просто запустите его снова. Оба файла здесь имеют скриншоты выше.

До сих пор мы вручную установили объект с помощью метода SET (), так как использовать весна IOC?

3. Подробное объяснение файла конфигурации Spring IoC

Файл конфигурации также необходим, но что этот файл нужно настроить и как его настроить?

Официальный сайт написал для нас:

Spring IoC?看这篇带你吃透 IoC 原理。

Первый абзац представляет собой введение в некоторые пространства имен и их спецификации.

Второй пункт — присвоение значений свойствам бина.

Обратите внимание, что конфигурацию в bean-компоненте необходимо изменить на ту, которая соответствует нашему проекту. Что здесь означает id, class? На официальном сайте также есть пояснение, кратко изложу его здесь:

  • Биржевая фасоль: скажите весенние предметы для создания
  • id: Уникальный идентификатор объекта, как и удостоверение личности каждого, не может быть повторен
  • class: полное имя bean-компонента, т. е. от имени пакета до имени класса
  • свойство: присвойте значение свойству, имя имени зависит от параметров, стоящих за методом set();

На самом деле, вы также можете использовать конструктор для присвоения значений, а название имени зависит от списка параметров, более подробное использование присвоения значений сложным типам данных можно найти на официальном сайте.

Конечно, аннотации чаще используются на работе. Но часто бывают xml-файлы, которые используются вместе, так что разбираться все же нужно.

Мой служебный файл настроен следующим образом:

Spring IoC?看这篇带你吃透 IoC 原理。

4. Последний шаг, давайте посмотрим, как он используется:

Spring IoC?看这篇带你吃透 IoC 原理。

Здесь нет прямого нового сервиса, но контейнер Spring помогает нам создать этот объект.

Так как же Spring помогает нам создавать объекты?

ApplicationContext — это точка входа контейнера IoC, который фактически является точкой входа программы Spring Я только что упомянул два его конкретных подкласса реализации, и здесь мы используем метод чтения данных из пути к классу;

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

Spring IoC?看这篇带你吃透 IoC 原理。

Нажмите и обнаружите, что он определен в BeanFactory.class:

Spring IoC?看这篇带你吃透 IoC 原理。

Который чаще используется

  • ID → Надо отличить
  • Тип бина → можно использовать только в синглтоне, иначе я не знаю, какой использовать
  • Id + Type → пример кода ниже

Для получения объекта последние два метода переменных параметров, такие как объекты String и Class, используются редко.

Как кошки и тигры, мой тестовый файл изменяется следующим образом:

Spring IoC?看这篇带你吃透 IoC 原理。

запустить успешно~~

Дополнение 1. Объекты по умолчанию — это синглтоны в контейнере.

Практика является единственным стандартом для проверки:

Затем используйте getBean(), чтобы получить объект и проверить, не изменился ли он.

который:

public class MyTest {
  public void test myTest() {
    ApplicationContext context = new ClassPathXmlApplicationContext("service.xml");
        Rectangle rect = context.getBean("rectangle", Rectangle.class);
        Rectangle rect2 = context.getBean("rectangle", Rectangle.class);
        System.out.println(rect == rect2);
    }
  }
}

вернуть True или False?

Ответ: правда

Поскольку по умолчанию используется синглтон, если вы хотите его изменить, вам нужно изменить в файле конфигурации.

Что касается этих тегов, это больше не расширяется ~

Следуйте 2. Контейнер, когда объект создан?

Практика - единственный критерий для тестирования:

Определите конструктор без параметров, напечатайте в нем предложение, а затем просто новый ClassPathXmlApplicationContext, как показано ниже:

Spring IoC?看这篇带你吃透 IoC 原理。

Открытие также можно распечатать, так что фактически каждый раз при запуске контейнера создаются все объекты в контейнере. (Конечно, это не применяется, когда scope = "prototype" , только singleton.)

Еще одна вещь, на самом деле лучше всего оставить конструктор без параметров, потому что создание объекта bean здесь происходит через отражение,

  • clazz.newInstance() по умолчанию вызывает конструктор без параметров

Теперь, однако, это было отказано и заменить его этим:

  • clazz.getDeclaredConstructor().newInstance()

Во-вторых, использовать Maven для создания проектов.

Давайте вернемся к первому строительному проекту. Я думаю, все поняли, насколько утомительно вручную импортировать пакеты jar. На самом деле, мы также можем использовать Maven для управления пакетами jar в проекте, что также является более распространенным методом в компании. , Процесс ручной загрузки пакета jar.

1. Создайте новый проект

Использование Maven намного проще, сначала мы создаем проект Maven, который отличается от предыдущего процесса:

При создании нового проекта выберите сборку из Maven вместо простого проекта Java.

Spring IoC?看这篇带你吃透 IoC 原理。

После того, как он будет построен, мы обнаружим, что есть намного больше вещей, чем в предыдущем проекте Java:

А перед пустым проектом не то же самое, есть основной, тестовый, в котором ресурсы кладутся на место конфигурационного файла, то есть мы просто сюда должны ставить service.xml, если некуда позиционировать код не могу найти о ~

Spring IoC?看这篇带你吃透 IoC 原理。

2. Добавьте соответствующие зависимости POM, вам не нужно вручную импортировать пакет JAR

  1. Адрес складаmvnrepository.com/
  2. поисковая пружина
  3. Выберите контекст Spring → выпуск 5.2.3, скопируйте конфигурацию внутри в pom.xml.

Наконец, внешние библиотеки слева автоматически отобразят необходимые пакеты, импорт в один клик, не слишком удобно~

3. Напишите код~~

резюме

Давайте, наконец, испытаем процесс создания объектов с помощью Spring:

Через запись контейнера IoC, ApplicationContext, используйте два его конкретных подкласса реализации для чтения данных из пути к классу или пути к файлу и используйте getBean() для получения конкретного экземпляра компонента.

Итак, какую работу мы пропустили при использовании Spring?

О: Новый процесс. Процесс создания нового передается третьей стороне для создания и управления, что является «расцеплением».

Spring IoC?看这篇带你吃透 IoC 原理。

Spring также использует метод set(), который просто обеспечивает более полный механизм реализации.

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

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

Оригинальная ссылка:Tickets.WeChat.QQ.com/Yes/F_ISM JW ню…