предисловие
над«Освоение профилей 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
получить базовыйConfigurableEnvironment
instance, а затем инициализируйте конфигурацию объекта экземпляра и верните ее.
создание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
,yml
Format вам нужен другой 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 для более точного определения цели в сложный код.