Прошлое и настоящее Dubbo-SPI и IoC

Java задняя часть
Прошлое и настоящее Dubbo-SPI и IoC

предисловие

В конце предыдущей статьи мы упоминалиdubboизspiдобавлено вIoCиAOPфункции.Тогда в этой статье пойдет речь об этом повышенномIoC,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-код нижеОбратите внимание на Фей Чао, пусть те, кто должен строить ракеты, перестанут трахаться!