Интерпретация исходного кода Spring Boot Profiles

Spring Boot

предисловие

над«Освоение профилей Spring Boot в одной статье»Это введение и использование весенних загрузочных профилей, поэтому эта статья будет изучать профили загрузки Spring из исходного кода, давайте посмотрим, как подпружиненный ботинок изолирован и эффективен.

текст

Во-первых, давайте взглянем на следующий простой пример программы Spring Boot,

В основном методе программы объект User получается из контейнера печати, который имеет только одинnameАтрибуты.

здесьnameСвойство ссылается на внешнюю конфигурациюuser.usernameЗначение считывается из файла конфигурации, здесь я определяю два файла конфигурации для установки этого свойства,application.propertiesа такжеapplication-prod.properties.

После того, как у вас есть файл конфигурации, запуститеSimapleSpringApplicationпрограммы, мы можем сначала увидеть ввод журнала:User Bean: User(name=one), видно, что программа читаетapplication.propertiesизuser.usernameконфигурация. теперь мыapplication.propertiesДобавьте строку в:

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

В этот момент свойство name объекта User становитсяapplication-prod.propertiesзначение, определенное в , а журнал предлагаетThe following profiles are active: prodуказывает имяprodПрофиль активирован в программе. Далее, давайте начнем с этого журнала и рассмотрим, как все это произошло.

Во-первых, в соответствии с функцией глобального поиска IDE, ищите напрямуюThe following profiles are active:Чтобы найти место, где появляются эти слова, вы можете обнаружить, что этот журнал появляется вSpringApplication#logStartupProfileInfoв методе.

Из метода журнала видно, что распечатанныйactiveProfilesиз контекстаenvironmentобъект, смотреть дальшеlogStartupProfileInfoМесто вызова , можно найти вSpringApplication#prepareContextИз названия видно, что этот метод в основном отвечает за подготовку контекста контейнера перед запуском Spring Boot.

Мы повторно запустим программу, посредством точки останова перехватаSpringApplication#prepareContextуказатель на метод, получитьenvironmentРеальный тип объекта — StandardEnvironment, который представляет собой стандартную реализацию интерфейса Environment для не-веб-сред. Он хранит некоторую конфигурацию приложения и информацию о профилях. В веб-среде контекст связан с объектом типа StandardServletEnvironment.

Зная, что журнал печатается из объекта StandardEnvironmentactiveProfilesПосле свойства нужно посмотреть, когда оно было присвоено. Продолжайте смотреть вверх с верхнего уровня цепочки вызовов, и вы тамSpringApplication#run(java.lang.String...), который также является основным методом запуска всей программы.

Из рисунка видно, что первый получилenvironmentобъект изSpringApplication#prepareEnvironmentгенерируется внутри,prepareEnvironmentВнутри метода первый проходgetOrCreateEnvironmentполучить базовыйConfigurableEnvironmentinstance, а затем инициализируйте конфигурацию объекта экземпляра и верните ее.

созданиеenvironmentобъект изSpringApplication#getOrCreateEnvironment, посмотрите на его реализацию, чтобы убедиться, что мы упоминали ранееenvironmentТип объекта — StandardEnvironment.

пониматьenvironmentСоздание , а затем сосредоточиться наenvironmentинициализируется, здесь нужно обратить внимание наlisteners.environmentPrepared(environment)Эта строка кода, здесьlistenersДля экземпляра SpringApplicationRunlisteners это объект коллекции прослушивателя SpringApplicationRunlistener.SpringApplicationRunListener#environmentPreparedКаждый метод должен перейти к похожим объектам SpringApplicationRunListenerenvironmentPreparedметод, в текущей коллекции есть только один экземпляр EventPublishingRunListener, просмотрите егоenvironmentPreparedметод, вы можете видеть, что он в основном используется для публикацииenvironmentпримерApplicationEnvironmentPreparedEventсобытие, пусть все другие слушатели прослушивают событиеenvironmentКонфигурация экземпляра.

Объект события ApplicationEnvironmentPreparedEvent также имеетgetEnvironmentспособ получить пройденныйenvironmentНапример, мы можем узнать, какие классы настраиваются, посмотрев, где используется этот метод.environmentобъект.

После многих просмотров на приведенном выше рисунке вы можете найти пару методов в классе ConfigFileApplicationListener.environmentОбъект развернут.Из именования видно, что этот слушатель связан с конфигурационным файлом, например, некоторые его постоянные свойства:CONFIG_NAME_PROPERTY,CONFIG_LOCATION_PROPERTYЖдать. Как видно из аннотации класса, программа Spring Boot запускает загруженныйapplication.propertiesилиapplication.ymlПо умолчанию он загружается с четырех путей.Последний используется чаще всего.Он также может подсказать нам, куда поместить файл конфигурации и как настроить путь для загрузки файла конфигурации.

  • file:./config/:
  • file:./
  • classpath:config/
  • classpath:

Установите точку останова программы вConfigFileApplicationListener#onApplicationEventВ методе повторно запустите программу, чтобы увидеть, что программа работает в это время.ConfigFileApplicationListenerВ классе внутренне через несколько вызовов методов изonApplicationEventприбытьaddPropertySourcesметод, этот метод заключается в загрузке источника свойств файла конфигурации вenvironmentокружающая обстановка.

здесьLoaderдаConfigFileApplicationListenerЧастный класс внутри класса используется для координации источников свойств и профилей конфигурации, и далее мы проследим его метод загрузки.

В этом методе мы в основном рассматриваем три метода:

  • Loader#initializeProfiles
  • Loader#addProfileToEnvironment
  • Loader#load(Profile, DocumentFilterFactory, DocumentConsumer)

первый методinitializeProfilesИнициализировать профили, даваяprofilesатрибут добавляет два элемента,nullи профиль по умолчанию.

второй методaddProfileToEnvironmentдобавить Профиль вenvironmentобъектactiveProfiles, который является первой печатью журналаactiveProfiles.

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

Войтиloadметод, который внутренне пытается выполнить другой через разные пути конфигурацииloadспособ загрузки файла конфигурации, здесьnameЭто имя файла конфигурации для поиска, по умолчаниюapplication.

Поскольку наш файл конфигурации находится в ClassPath, просто обратите внимание на то, когдаlocationдляclasspath:/выполнение программы.

Благодаря поддержке файла конфигурации SpringBootxml,properties,ymlFormat вам нужен другой PropertySourceLoader для поддержки загрузки содержимого файла: поддержка PropertiesPropertySourceLoaderxml,propertiesфайл, YamlPropertySourceLoader поддерживает файлы yml, загрузку с.ymlили.yamlСуффиксированные файлы,Loader#loadForFileExtensionМетод завершает загрузку этих файлов конфигурации.

Наша примерная программа имеет толькоpropertiesфайл, поэтому просто обратите внимание, когдаloaderКогда это PropertiesPropertySourceLoaderLoader#loadForFileExtensionреализация метода.

loadForFileExtensionВнутренне вызывает другой, который загружает файл конфигурацииloadметод при чтении в ClassPathapplication.properties, будет выполняться до тех пор, покаLoader#loadDocumentsЭтот метод заключается в загрузке файла конфигурации в виде документа, и все конфигурации пар "ключ-значение" будут сохранены в PropertySource и сохранены в объекте Document.

!](Спросите 3. Sinai U.S. Talent/large/006TN…)

а такжеdocumentsобъект проходит черезLoader#asDocumentsметод, связанныйspring.profiles.activeАтрибуты,profilesатрибут добавить определение какprodПрофиль, подготовьтесь к добавлению профиля в следующий объект среды, перейдите к файлу конфигурации по умолчанию здесьapplication.propertiesЗагрузка завершена, метод вернулсяLoader#load()начальство.

С вновь добавленным профилем продолжайте входить в цикл, он пройдетLoader#addProfileToEnvironmentметод, дляenvironmentОбъект сохраняет активный Профиль и по предыдущей логике читает файл с именемapplication-prod.propertiesфайл конфигурации, названный по предыдущемуLoader#loadForFileExtensionЭто можно увидеть в строке 462:

существуетLoader#load()После того, как метод прочитает все файлы конфигурации, выполнитеLoader#addLoadedPropertySources, сохраните соответствующий источник свойства PropertySource вenvironmentобъект иapplication-prod.propertiesПорядок предшествует файлу конфигурации по умолчанию, поэтому, когда последующие программы применяют конфигурацию с тем же именем, предпочтительна конфигурация с позицией элемента первой.

В этот момент данные обо всех файлах конфигурации загружаются и сохраняются в данных, связанных с текущим контекстом.environmentобъект,prodРабота по активации конкретной конфигурации среды в качестве активного профиля завершена.

резюме

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

Рекомендуемое чтение