Spring IoC — Дизайн Spring IoC

Java

предисловие

Эта статья является первым введением в интерпретацию исходного кода модуля Spring IoC. Познакомить с соответствующими концепциями и дизайном Spring IoC.

What is IoC

Инверсия управления (сокращенно IoC) — это принцип проектирования в объектно-ориентированном программировании, который можно использовать для уменьшения связи между компьютерными кодами. Наиболее распространенный способ называется внедрение зависимостей (DI), и есть еще один способ, называемый «поиск зависимостей». Посредством инверсии управления при создании объекта внешний объект, управляющий всеми объектами в системе, передает (внедряет) ссылки на объекты, от которых он зависит.

-- из Википедии

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

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

В системе ООП объект инкапсулирует данные и обработку данных, а зависимость объекта воплощена в зависимости от данных и методов. Эти зависимости можно реализовать путем доставки внедрения зависимостей объекта во фрейм или контейнер IOC.

Проще говоря:

  • Контроль: контроль текущего объекта над своими внутренними объектами-членами/процессом получения собранных объектов.
  • Обратное: вышеуказанный процесс/элемент управления управляется специализированным сторонним компонентом (контейнером или платформой).

Эта практика передачи управления из рук конкретных объектов улучшает тестируемость кода при разделении кода. Преимущества заключаются в следующем:

  1. Вам не нужно собирать его самостоятельно, просто используйте его.
  2. Наслаждайтесь преимуществами синглтона, который эффективен и не занимает много места.
  3. Он удобен для модульного тестирования и легко переключает фиктивные компоненты.
  4. Он удобен для выполнения АОП-операций и прозрачен для пользователя.
  5. Унифицированная конфигурация, легко модифицируемая.

Spring IoC

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

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

Spring IOC предоставляет базовый javabean контейнер, управляет зависимостями через режим МОК, и повышает базовые функции, такие как управление транзакциями и управление жизненным циклом для объектов POJO, таких как Javabeans, посредством инъекций зависимости и аспекты AOP.

Дизайн контейнера IoC

В дизайне контейнера Spring IOC мы можем видеть два основных семейства контейнеров (согласно именованию):

  • Простая серия контейнеров, которая реализует интерфейс BeanFactory и реализует только самые основные функции контейнера;
  • Контекст приложения ApplicationContext, расширенная форма контейнера, добавляет множество функций, ориентированных на структуру, и адаптацию к среде приложения;

Для пользователей это контейнеры, которые являются разными проявлениями контейнеров.Какие именно контейнеры используются, полностью зависит от потребностей пользователей.

undefined

BeanFactory

Интерфейс BeanFactory определяет самую базовую форму контейнера IoC и предоставляет самый базовый сервисный контракт, которому должен соответствовать контейнер IoC. Контейнер IoC.Эти определения интерфейса определяют основные принципы IoC.

Все дерево наследования в дауне довольно сложное, вам не нужно все мастерство Я думаю, что мы изучили исходный код раньше, найдите основной класс. Теперь подойдите, чтобы выбрать несколько ключей beanfactory, чтобы сказать. Избегание главы об анализе исходного кода будет лицом.

  • ListableBeanFactory, этот листимый означает, что через этот интерфейс мы можем получить несколько бобов. Если вы посмотрите на исходный код, вы обнаружите, что методы верхнего фасочного интерфейса - все для получения одной фасоли.
  • ApplicationContext наследует HierarchicalBeanFactory.Само слово Hierarchical может объяснить проблему, то есть мы можем запустить несколько BeanFactory в приложении, а затем установить каждую BeanFactory как отношение родитель-потомок.
  • Autowire в названии AutowireCapableBeanFactory всем хорошо знаком, он используется для автоматической сборки bean-компонентов, но если вы посмотрите на картинку выше, ApplicationContext его не наследует, но не волнуйтесь, неиспользование наследования не означает, что вы не можете используйте композицию.Если вы видите последний метод getAutowireCapableBeanFactory() в определении интерфейса ApplicationContext.
  • DefaultListableBeanFactory в Spring фактически использует DefaultListableBeanFactory в качестве полнофункционального контейнера IoC по умолчанию. Содержит важные функции, которыми обладает базовый контейнер IoC.

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

ApplicationContext

ApplicationContext — это контейнер IoC с высокоуровневой морфологической значимостью.ApplicationContext интегрируется с BeanFactory на основеMessageSource, ApplicationEventPublisher, ResourcePatternResolverЭти интерфейсы предоставляют ApplicationContext следующие новые функции, которых нет у BeanFactory:

  • Поддерживаются различные источники информации. Мы видим, что ApplicationContext расширяет интерфейс MessageSource.Функции расширения этих источников информации могут поддерживать реализацию интернационализации и предоставлять услуги для разработки многоязычных приложений.
  • Доступ к ресурсам. Эта функция отражена в поддержке ResourceLoader и Resource, так что мы можем получать ресурсы определения Bean из разных мест. Эта абстракция позволяет пользовательским программам гибко определять информацию об определении Бина, особенно для различных способов ввода/вывода.
  • Поддержка событий приложений. Унаследовал интерфейс ApplicationEventPublisher, тем самым внедрив механизм событий в контекст. Сочетание этих событий и жизненного цикла Бина обеспечивает удобство управления Бином.
  • Дополнительные службы, предоставляемые в ApplicationContext. Эти сервисы делают базовый контейнер IoC богаче. Из-за этих богатых дополнительных функций использование ApplicationContext является ориентированным на структуру стилем по сравнению с простым BeanFactory, поэтому обычно рекомендуется использовать ApplicationContext в качестве базовой формы контейнера IoC при разработке приложений.

BeanDefinition

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

BeanDefinition хранит информацию о нашем Bean, например, на какой класс указывает этот Bean, является ли он синглтоном, загружается ли он отложенно, от каких bean-компонентов зависит этот Bean и так далее.

image.png

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

Эти BeanDefinitions подобны воде в контейнере.С этими базовыми данными контейнер может функционировать.

Эпилог

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

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

Ссылаться на