(Введение 1 можно пропустить) Мощные возможности расширения Spring способствуют его интеграции с новыми технологиями и поддерживают его длительную жизнеспособность Знакомство со Spring является одним из основных навыков программного обеспечения, особенно интернет-разработчиков, особенно при использовании микросервисов Spring Boot, созданных для основы сейчас все в моде.
(Введение 2 можно и дальше пропускать.) Spring Boot — это основа для создания микросервисов.Он упрощает тяжелый процесс разработки и развертывания Spring, делая интеграцию, разработку конфигурации и развертывание различных вышестоящих и нижестоящих фреймворков очень простыми, но ядро по-прежнему Весна.
Исходный код Spring очень сложен, и в Интернете есть много связанных статей (рекомендуется прочитать исходный код против статьи, сначала получить общее представление об общем процессе, в основном о процессе запуска, а затем уточнить его и быть ориентированным на практику), вот его два основных IOC. Откройте два портала с АОП, заинтересованные студенты могут взглянуть (статья очень длинная, не подходит для фрагментарного чтения):
IOC: Анализ исходного кода контейнера Spring IOC
AOP: комплексный анализ Spring-aop
Spring в целом представляет собой контейнер управления Bean, наиболее важным ядром является Bean (Bean можно отличить по идентификатору или имени , также можно отличить по типу класса), абстрагировать определение bean-компонента в Beandefinition из XML-файла или объявления аннотации (Beandefinition поступает из различных источников, в дополнение к самоопределению, введены сторонние аннотации, BeanDefinitionRegistryPostProcessor (например, ConfigurationClassPostProcessor ) можно использовать для Introduce Beandefinition), Beandefinition управляется Beanfactory, Beanfactory используется как внутренний атрибут Applicationcontext, и существует иерархическая связь между различными Applicationcontexts.В процессе поиска bean-компонентов вы можете искать вдоль этой иерархической связи (если вы не можете найти его в своем собственном Beanfactory, тогда ищите вышестоящего родителя), а затем инициализируйте Bean через Beandefinition.
Во время инициализации можно установить много точек расширения (например, инициализацию до, после), вы можете посмотреть на определенный механизм расширения BeanPostProcessor и т. Д. (Мы также можем объединить пользовательскую аннотацию в процессе разработки для этого, чтобы сделать некоторое развитие расширения).
Принцип IOC заключается в том, чтобы внедрить компонент в другой компонент (т. е. внедрение зависимости) через третье лицо, то есть контейнер Spring.С помощью типа, имени, метода построения и т. д. можно обратить внимание на циклические зависимости. .
Принцип АОП заключается в преобразовании bean-компонента в динамический прокси-компонент через динамический прокси (следует понимать динамический прокси jdk и cglib) в точке расширения, описанной выше (то есть точке расширения beanpostprocessor), и динамическом прокси-сервере. bean можно использовать в исходном bean.Добавьте некоторые свои собственные расширения до и после выполнения кода (на этом основаны кеширование Spring и Transaction).
Существенным отличием Spring Boot от традиционной Spring-разработки является большое количество аннотаций.Что такое аннотации?Это метаданные, используемые для описания классов, полей и методов.Некоторые из них могут быть удалены перед компиляцией, а некоторые будут скомпилированы в файлы классов. , сама аннотация не имеет никакого эффекта, но выполнение некоторой специальной обработки в соответствии с метаданными в процессе обработки Bean делает аннотацию мощной.
Механизм автоконфигурации Spring Boot облегчает интеграцию с другими фреймворками, см. мою предыдущую статью (Весенний ботинок нулю), отсканировав файл spring.factory по пути к классам, вы можете легко добавить класс расширения в определение Bean.Для расширения определения Bean вы можете увидеть несколько важных аннотаций: конфигурация, импорт и связанные *ConfigurationSelector, расширение метод очень гибкий, но он служит только одной цели — добавить соответствующее определение Бина в Beanfactory.
Когда другие фреймворки интегрированы в Spring, они, как правило, не могут обойти эти моменты.Импортируйте связанные bean-компоненты через аннотации, или добавьте какую-то собственную логику к исходным bean-компонентам для возврата прокси-бинов, а также bean-компоненты могут получать различные триггеры событий Приложения. создание мощной функции.
В процессе рассмотрения фреймворка, связанного со Spring, обращая внимание на эти моменты, я думаю, что он все еще относительно быстр:
1. Посмотрите на общее описание фреймворка, получите открытые аннотации (такие как Enable*) и посмотрите, какие ключевые компоненты импортируются, особенно те, которые связаны с точками расширения.Эти компоненты часто выполняют некоторую специальную обработку в соответствии с аннотациями;
2. Посмотрите на общую функцию фреймворка, позаботьтесь о синхронных/асинхронных и длинных/коротких соединениях и push/pull, выполните поиск некоторых ключевых точек для функций и найдите ключевые реализации;
3. В соответствии с ключевой реализацией используйте артефакт Intellij для обратной трассировки, быстрого понимания всего процесса или поиска тестового класса (например, *Test) и передачи кода отладки тестового класса;
4, для реализации ключевых технологий, влияющих на производительность, необходимо вытащить детали и основные Threadlocal (переменные контекста запроса хранилища), кеш, пул соединений, пул потоков, неблокирующую асинхронную рефлексивную обработку по сокращению времени выполнения. .
Благодаря вышеизложенным пунктам я быстро прояснил общий поток обработки исходного кода стека технологий Spring Cloud (zuul/eureka/feign/ribbon/apollo), но прерыватель цепи Hystrix в Spring Cloud использует много реактивного программирования (Rxjava ), это все еще довольно запутанно.Рекомендуется сначала посмотреть на простой пример и выяснить, как подписчик передается вверх и как набор результатов отправляется вниз, а также влияние пулов потоков подписки и наблюдения на данные передачу, а потом посмотреть на нее для сравнения.
Для Rxjava плюс портал:Rxjava