Когда мы разрабатываем приложения на основе пружины, мы обычно размещаем конфигурацию базы данных в файл свойств.
Сводка знаний, связанных с анализом кода:
1.namespacehandler Проанализирует пользовательское пространство имен в файле конфигурации XML
2. ContextNamespaceHandler, связанный с контекстом
3. BeandefinitionParser анализирует интерфейс определения бобов
4.BeanFactoryPostProcessor После загрузки определения бобов его можно изменить.
5. PropertySourcesplaceholderConfigurer обрабатывает заполнители в определении бобов
Давайте сначала посмотрим на конкретное использование
Использование собственности
Настроить файл свойств в файле XML
<? xml version = "1.0" Encoding = "UTF-8"?> <Beans xmlns = "http://www.springframework.org/schema/beans" xmlns: xsi = "http://www.w3.org/2001/xmlschema-instance" xmlns: context = "http://www.springframework.org/schema/context" xsi: schemalocation = "http://www.springframework.org/schema/beans/spring-xpring-xpring-xpring-xpring-xpring-xprish-beans. http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd "> <Контекст: property-proceholder mocate =" classpath: foo.properties "/> </beans>
Таким образом, файл /src/main/resources/foo.properties будет загружен пружиной
Если вы хотите использовать несколько файлов конфигурации, вы можете добавить поле Заказа в сортировку
Используйте свойства для аннотирования конфигурации
Spring 3.1 добавила аннотацию @propertysource, чтобы облегчить добавление файлов свойств в окружающую среду.
@Configuration @propertysource ("classpath: foo.properties") public class propertieswithjavaconfig {@bean public static propertysourcesplaceholdercorurer propertysourcesplaceholderconfigurer () {return new PropertySourcesplaceHolderCurer (); }}Инъекция и использование свойств
1. Используйте аннотацию @value, чтобы получить на Java
@Value ("$ {jdbc.url}") частная строка jdbcurl;Вы также можете добавить значение по умолчанию
@Value ("$ {jdbc.url: adefaulturl}") частная строка jdbcurl;1. Получите его в файле конфигурации XML Spring
<bean id = "dataSource"> <name = "url" value = "$ {jdbc.url}" /> < /bean>Анализ исходного кода
Загрузка информации о конфигурации свойств
Spring запустит работу по инициализации контейнеров через AbstractApplicationContext#обновление при запуске, и в течение этого периода будут поручены загружать файл конфигурации XML.
Защищенный final void refreshbeanfactory () бросает Beansexception {if (hasbeanFactory ()) {destroyBeans (); CloseBeanFactory (); } try {default -lectablebeanfactory beanfactory = createBeanFactory (); beanfactory.seterializationid (getId ()); CustomizeBeanFactory (BeanFactory); LoadBeandefinitions (BeanFactory); синхронизированный (this.beanfactorymonitor) {this.beanfactory = beanfactory; }} catch (ioException ex) {throw new ApplicationContextexception ("Источник определения ошибок в IO/O. }}LoadBeanDefinitions через слой по сложному делегированию, найдите DefaultBeandefinitionDocumentReader#parsebaindefinition, чтобы разобраться с конкретными бобами
Protected void parsebaindefinitions (элемент root, beandefinitionparserdelegate делегат) {if (delegate.isdefaultnamespace (root)) {nodelist nl = root.getchildnodes (); for (int i = 0; i <nl.getLength (); i ++) {node node = nl.item (i); if (instanceOf element) {element ele = (element) node; if (delegate.isdefaultnamespace (ele)) {parsedefaultelement (ele, delegate); } else {delegate.parsecustomelement (ele); }}}} else {delegate.parsecustomelement (root); }} Поскольку это не стандартное определение класса, оно поручает BeandefinitionParserDelegate для анализа
Найдите соответствующий процессор через имен -пространство, чтобы найти контекст -размархандлер, а затем найдите анализ анализа синхронизации PropertyplaceplyfeantitionParser через ID ID
@Override public void init () {// Это анализатор, который мы ищем RegisterBeanDefinitionParser ("Property Placeholder", New PropertyPlaceholderBeandefinitionParser ()); RegisterBeandefinitionParser ("Property-Override", New PropertyOverrideBeanDefinitionParser ()); RegisterBeandefinitionParser ("Annotation-Config", New AnnotationConfigbeandefinitionParser ()); RegisterBeandefinitionParser («Компонентный сканирование», New ComponentsCanbeandefinitionParser ()); RegisterBeandefinitionParser («Время загрузки», новый LoadTimeWeaverBeanDefinitionParser ()); RegisterbeandefinitionParser («Спонсовый конфигурация», New SpringConfiguredBeandefinitionParser ()); RegisterBeanDefinitionParser («MBEAN-EXPORT», New MBEANEXPORTBEANDEFINITIONPARSER ()); RegisterbeandefinitionParser («MBEAN-Server», New MBEANSERVERBEANDEFINITIONPARSER ()); } PropertyplaceholderbeandefinitionParser находится в центре внимания этого раунда анализа кода.
Давайте посмотрим на его родительский класс.
1.BeandefinitionParser
Используется по умолчанию BeandefinitionDocumentReader для анализа персонализированных тегов
Здесь определяется только API Parse, который диапазон анализации определяется
Public Interface BeandefinitionParser {Beandefinition parse (элемент элемента, parsercontext parsercontext);} 2. AbstractbeandefinitionParser
Абстрактная реализация по умолчанию интерфейса BeandefinitionParser. Весна хороша в этом. Он предоставляет здесь много удобных API и использует шаблон проектирования метода шаблона для предоставления пользовательских крючков реализации для подклассов.
Давайте посмотрим на конкретную логику обработки, когда Parse: вызовите Parseinternal Parse крючком
3. AbstractsingsingbeandefinitionParser
Проанализируйте, определите абстрактный родительский класс одного боандрирования
В Parseinternal, Parse Parentname, Beanclass, Source; и инкапсулировать с помощью BeandefinitionBuilder
4. AbstractPropertyloadingBeandefinitionParser
Анализировать свойства, связанные с свойствами, такие как местоположение, свойства-реф, кодирование файлов, заказ и т. Д.
5. PropertyplaceholderbeandefinitionParser
Здесь не так много всего, что просто создайте нерезолируемый и системный реперсельный режим
Файл свойств загрузки, экземпляры бобов
Далее, давайте посмотрим, когда этот боб создается. Существует два типа экземпляров общих классов. Один из них создается, когда начинается система Синглтона; Другой создается экземпляр, когда не-синглетон (или ленивая загрузка синглтона), когда getbean создается.
Триггер здесь - через BeanfcatoryPostProcessor.
BeanFactoryPostProcessor Модифицирует определение бобов перед экземпляром бобов. Например, здесь решаются заполнители в определении бобов, а свойства, которые мы используем сейчас, также решаются здесь.
Это реализовано через постпроцессорную регистрацию,#invokebeanfactorypostprocessors.
Сканируйте BeanFactoryPostProcessor в контейнере, найдите здесь необходимый PropertySourcePlaceholderConfiger, и создайте его через GetBean контейнера
Protected void invokebeanFactoryPostProcessors (ConfigurableListableBeanfactory BeanFactory) {PostProcessorRegistrationDelegate.invokebeanFactoryPostProcessors (BeanFactory, GetBeanFactoryPostProcessors ()); }После того, как экземпляр PropertysourcesplaceholderConfigurer будет завершен, он будет запускаться напрямую и загружена информация.
Ordercomparator.sort (приоритетный заказпостпроцессор); InvokebeanfactoryPostProcessors (PriorityOderdPostProcessors, BeanFactory);
Давайте посмотрим на систему наследования недвижимости.
1.BeanFactoryPostProcessor
Определите интерфейс для изменения свойств определения бобов в контейнере. Его класс реализации создается до того, как используются общие классы, а свойства других классов будут изменены.
Это, очевидно, отличается от Beanpostprocessor, что изменяет экземпляры бобов.
2.Properties BloaderSupport
Абстрактный класс, который загружает свойства файлов.
Конкретная логика загрузки здесь состоит
3. PropertyResourceConfigurer
Замена заполнителей в определении бобов реализована этим абстрактным классом.
Реализовать BeanFactoryPostProcessor#PostProcessBeanFactory, итерация над определением класса в контейнере и измените его
Как изменить его реализуется путем передачи его подклассу через процесс процесса крюка
4. Placeholderconfigerersupport
Используйте шаблон дизайна посетителя, чтобы обновить свойства через BeandefinitionVisitor и StringValueresolver
StringValueresolver - это интерфейс, который преобразует данные типа строки. Реализация API, которая действительно обновляет свойства, на самом деле находится в
PropertyplaceholderHelper#parsestringValue
5. PropertySourcesplaceholderConfigurer
Переопределить процесс анализа определения API PostProcessorBeanFactory API
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.