предисловие
В конце предыдущей статьи мы упоминалиdubbo
изspi
добавлено вIoC
иAOP
функции.Тогда в этой статье пойдет речь об этом повышенномIoC
,spi
Часть его ожидается иметь четыре, потому что это дело слишком важное.Обзор прошлого, чтобы узнать новое, давайте повторим то, о чем мы говорили ранее.
-
Расскажите о механизме родительского делегирования в ядре Dubbo.В основном рассказывается об основных понятиях SPI, простом входе и
spi
объяснил для подсказок双亲委托模式
недостатки и решения -
В чем разница между Dubbo и SPI JDK?В основном
dubbo改进了jdk的spi
Для подсказок сосредоточьтесь на идее анализа проблем, от реальных случаев до реальных боевых действий.从哪里着手分析问题
Это любимый вопрос каждого.
упомянулIoC
, первое что приходит на умSpring
, поэтому веснаIoC
Это также является основным направлением данной статьи.Конечно, в конце концов, темаdubbo
, Таким образом, дляSpring
Содержимое будет объединено с даббо, чтобы быть кратким и лаконичным, но не лишенным подробного введения (если вам это понадобится позже, вы также можете разработать темы исходного кода Spring).
Когда вы видите это, некоторые одноклассники могут спросить: «Фей Чао, вы не пишете анализ исходного кода даббо, почему вы до сих пор говорите о Spring?» Даббо требует много маргинальных знаний, в том числеSpring
,Netty
,Zookeeper
Подождите, я надеюсь, что каждый сможет всесторонне и всесторонне улучшить себя, изучая даббо как основную линию, вместо того, чтобы смотреть исходный код ради просмотра исходного кода или смотреть исходный код для интервью.
Вопросы для интервью в прямом эфире
- ты упомянул даббо
spi
также увеличилосьIoC
, то вы сначала говорите о ВеснеIoC
, а потом поговорим о том, как это сделать в даббо
Весенний IoC
контейнер
В Spring существует два основных типа контейнеров IoC, а именноBeanFactory
иApplicationContext
-
BeanFactory
Это интерфейс самого низкого уровня в Spring, который предоставляет только самые простыеIoC
Функция, отвечающая за настройку, создание и управление бинами. -
ApplicationContext
наследоватьBeanFactory
имеет основнойIoC
В дополнение к функции, он также поддерживает- глобализация
- механизм сообщения
- Единая загрузка ресурсов
- AOP
Кроме тогоApplicationContext
Все bean-компоненты создаются во время загрузки (рекомендуется для веб-приложений),BeanFactory
Вам нужно подождать, пока вы не получите bean-компонент для создания bean-компонента (рекомендуется для настольных приложений), поэтому мы обычно используемApplicationContext
Общий процесс
Процесс реализации IoC в целом можно разделить на два этапа, как показано на следующем рисунке.
Фаза запуска контейнера
Этот этап эквивалентен «сборке производственной линии по чертежам», то есть сбору информации об управлении объектом.
Фаза создания экземпляра компонента
Этот этап эквивалентен «производству конкретных продуктов в соответствии с производственной линией».
расширять
Весна обеспечиваетBeanFactoryPostProcessor
Механизм расширения контейнера, который позволяет нам создавать соответствующие объекты в контейнере.До, для регистрации в контейнереBeanDefinition
Сохраненная информация модифицируется соответствующим образом.
Итак, какие практические сценарии у нас есть, чтобы использовать это拓展
Шерстяная ткань?
Например, когда мы настраиваем информацию базы данных, часто используются заполнители.
${jdbc.url}
когдаBeanFactory
Когда вся информация о конфигурации загружается на первом этапе, информация об атрибутах сохраненного объекта существует только в виде заполнителей.PropertySourcesPlaceholderConfigurer
Давайте посмотрим на схему системы наследования, чтобы понять.
PropertySourcesPlaceholderConfigurer
Реализуя этот интерфейс, при входе на второй этап была заменена информация-заполнитель.
Советы:
Внимательные студенты могут обнаружить, чтоPropertySourcesPlaceholderConfigurer
иPropertyPlaceholderConfigurer
Название похоже, в чем разница между ними? Давайте посмотрим на исходный код
Стук по доске
Почему я повторяю基础
,原理
, Это обман, чтобы вы обратили на меня внимание и завели еще одного поклонника?Поскольку основа прочная, после понимания принципа многие вещи действительно легко понять, особенноSpring Boot
Конфигурация упрощена, а многие задачи более простые.Демонстрирую простую задачу
Прежде всего, мы обнаружили, что этот заполнитель не был проанализирован. Если вы не знаете принцип, вы можете быть запутаны, но если вы видели официальный счет о Feichao, вы знаете, что оно отсутствует.PropertySourcesPlaceholderConfigurer
Итак, вы с радостью помирилисьPropertySourcesPlaceholderConfigurer
, нашел яму, заполнитель разбирается, но он естьnull
Затем вы связались с Фей Чао через личное сообщение, и Фей Чао сказал вам, добавьтеstatic
Вот и все. Так что, как только вы запустите его, это действительно здорово!
Но ты не можешь понять, зачем ты добавилstatic
Да?
Причина проста, сказал Фронт, а механизм расширения — это созданные объекты.之前
,Ты используешьstatic
Метод модификации относится к уровню класса и имеет высокий приоритет, естественно, разбор этого заполнителя завершается до создания экземпляра DataSource.
iOC в Дуббо спи
Поскольку это статья об анализе исходного кода, я постараюсь не публиковать большие фрагменты кода, в противном случае вы можете прочитать ее напрямую.Я использую диаграмму, чтобы примерно описать общий процесс.
В дополнение к предыдущей статьеobjectFactory
В дополнение к введению, отсюда мы знаем,objectFactory
Это объект поставщика IoC для dubbo.
public <T> T getExtension(Class<T> type, String name) {
//factories=[SpiExtensionFactory,SpringExtensionFactory]
//遍历获取spi,先从SpiExtensionFactory获取,如果没有,再从SpringExtensionFactory获取
for (ExtensionFactory factory : factories) {
T extension = factory.getExtension(type, name);
if (extension != null) {
return extension;
}
}
return null;
}
SpiExtensionFactory
public <T> T getExtension(Class<T> type, String name) {
if (type.isInterface() && type.isAnnotationPresent(SPI.class)) {
ExtensionLoader<T> loader = ExtensionLoader.getExtensionLoader(type);
if (loader.getSupportedExtensions().size() > 0) {
return loader.getAdaptiveExtension();
}
}
return null;
}
SpringExtensionFactory
public <T> T getExtension(Class<T> type, String name) {
for (ApplicationContext context : contexts) {
if (context.containsBean(name)) {
//从容器中获取注入的对象
Object bean = context.getBean(name);
if (type.isInstance(bean)) {
return (T) bean;
}
}
}
return null;
}
Даббо разработал эти два метода во время проектирования, но на момент2.5.4
Версия,SpringExtensionFactory
Метод еще не найден для использования, и он может быть как зарезервированное слово в Java, которое проложит путь в будущее.Говорят, что3.0
Версия готова, вы можете обратить на нее внимание, когдаSpringExtensionFactory
использование.
напиши в конце
Feichao — это технический публичный аккаунт, в котором основное внимание уделяется принципам, исходному коду и навыкам разработки, оригинальному тематическому анализу исходного кода в аккаунте и реальному сражению принципов исходного кода в реальных сценах (ключевые моменты).Отсканируйте QR-код нижеОбратите внимание на Фей Чао, пусть те, кто должен строить ракеты, перестанут трахаться!