Предисловие
С растущей популярностью Spring Boot, большинство конфигураций в приложении скрыты. Нам нужно только заботиться о реальном бизнес -контенте, контроллере, обслуживании, репозитории и при получении клавиатуры, вы можете использовать копию бизнес -кода. Конкретное сканирование компонентов, вид, заполнитель ... может быть оставлено позади. Но на самом деле эта нулевая конфигурация не долго в разработке приложений Java. «Трудно добраться от экстравагантного до бережливости». Многие разработчики испытали длительную конфигурацию Spring XML, и действительно трудно вернуться к этой конфигурации.
Но иногда, поскольку содержимое конфигурации не очень хорошо реализовано в нулевой конфигурации, такой как Spring Boot, нам все равно необходимо использовать форму конфигурации XML, а затем импортировать.
Затем давайте посмотрим на некоторые из пользовательских схемы в конфигурации XML, как некоторые пользовательские схемы интегрируются в пружину для конфигурации. Например:
Пружинные данные ES
Дуббо
Есть много таких примеров, что мы не будем перечислять их один за другим. Но через две вышеупомянутые фигуры мы находим общую особенность:
Итак, когда работают эти пользовательские конфигурации? Как проверить, является ли конфигурация правильной?
Давайте посмотрим на весну, содержащий файл с именем Spring.handlers. Все пользовательские расширения вступают в силу через этот файл. Весенний официальный AOP и TX также имеют этот принцип.
Где этот файл?
Как показано на рисунке выше, это мета-инф/пружина. Содержание файла также очень простое:
http/: //www.springframework.org/schema/data/elasticsearch=org.springframework.data.elasticsearch.config.elasticsearchnamespacehandler
Первый - это префикс каждой схемы, а следующий - это класс, соответствующий схеме. Когда загружается файл Spring.handlers?
Это также происходит при анализе пользовательского файла конфигурации. Существует процесс разрешения. В настоящее время будут загружены все файлы Spring.Handlers, соответствующие текущему загрузке класса.
Давайте снова посмотрим на этот класс анализа, содержание следующим образом:
открытый класс ElasticSearchNamespaceHandler Extens namespaceHandlersupport {public elasticsearchnamespacehandler () {} public void init () {repositoryConfigurationExtension extension = new ElasticSearchRepositoryConfigeExtension (); RepositorybeandefinitionParser parser = new RepositoryBeandefinitionParser (расширение); this.registerbeandefinitionParser («Репозитории», Parser); this.registerbeandefinitionParser ("Node-Client", New NodeclientbeandefinitionParser ()); this.registerbeandefinitionParser ("Transport-Client", New TransportClientBeanDefinitionParser ()); }} Во -первых, это унаследовано от имену
Затем серия анализаторов зарегистрирована в переписанном методе init. Каждый анализатор соответствует строке, которая является пользовательским контентом, который мы используем в файле конфигурации XML, такой как конфигурация ES выше
<Elasticsearch: Transport-Client id = "client" Cluster-Nodes = "192.168.73.186:9300"
Конфигурация здесь в конечном итоге будет проанализирована через TransportClientBeanDefinitionParser
Вышеупомянутые анализаторы хранятся в карте в методе init
Частная финальная карта <string, beandefinitionparser> parsers = new hashmap ();
Так называемая регистрация анализаторов состоит в том, чтобы поставить карту этого анализатора.
Оглядываясь назад, какой самый основной контент весны? Это боб. Фактически, содержимое, которое мы настраиваем в XML, в конечном итоге будет сгенерировано в соответствующей бобах. Все конфигурации просто для создания бобов. Эти пользовательские конфигурации называются Beandefinition.
Следовательно, при разборе пружины файл конфигурации будет следующее решение: будь то DefaultNamespace. Если нет, перейдите в CustomElementParse
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)) {this.parsedefaultelement (ele, delegate); } else {delegate.parsecustomelement (ele); }}}} else {delegate.parsecustomelement (root); }} Вместо этого суждение, которое не является defaultnamespace, является более прямым: есть ли у URI пространства имен контент или это утверждение пружинных бобов
Public Boolean IsDefaultNamespace (String namespaceuri) {return! StringUtils.haslength (namespaceuri) || "http://www.springframework.org/schema/beans".equals(namespaceuri); } Таким образом, все запросы пошли на ParseCustomelement, и начался анализ конфигурации. Когда Parse, соответствующий обработчик был найден через Urriesolver
Public Beandefinition parsecustomelement (element ele, beandefinition содержит bd) {string namespaceuri = this.getNamespaceuri (ele); Kingspacehandler handler = this.readercontext.getNamespacehandlerresolver (). Resolve (namespaceuri); if (handler == null) {this.error («Невозможно найти пружинные имена пространства для xml схемы пространства имен [" + namespaceuri + "]", ele); вернуть ноль; } else {return handler.parse (ele, new parsercontext (this.readercontext, это, содержит bd)); }} В настоящее время единственное, что возвращается, - это обработчик, настроенный в Spring.handlers, и каждый обработчик регистрирует много анализа, и необходим процесс получения анализаторов.
public beandefinition parse (элемент элемента, parsercontext parsercontext) {return this.findparserforelement (element, parsercontext) .parse (element, parsercontext); } private beandefinitionParser findParserForelement (элемент элемента, parsercOntext parsercOntext) {string localname = parsercontext.getDelegate (). getLocalName (element); BeandefinitionParser parser = (beandefinitionparser) this.parsers.get (localname); if (parser == null) {parsercontext.getReaderContext (). Fatal («не может найти BeAndefinitionParser для элемента [" + localname + "]", element); } вернуть анализатор; } Процесс получения этого состоит в том, чтобы получить соответствующий анализатор в карте, которую мы начинаем объявлять через пропущенную строку, а затем использовать его для анализа конфигурации.
С помощью анализатора следует процесс генерации Beandefinition.
Мы видим, что эти анализаторы унаследованы от AbstractBeandefinitionParser или реализуют интерфейс BeandefinitionParser. Метод интерфейса Parse - это вход в унифицированный анализ.
Общедоступный класс TransportClientBeanDefinitionParser ExtrableBeandefinitionParser {public TransportClientBeanDefinitionParser () {} Защищенный AbstractBeanDefinition ParseInternal (элемент элемент, parsercontext parsercontext) {beandefinitionbuilder builder = BeandefinitionBuilder.RootBeanDefinition (TransportClientFactoryBean.class); this.setConfigurations (элемент, строитель); вернуть это. GetSourceDbeanDefinition (Builder, Element, ParserContext); }} В переписанном методе Parseinternal верните соответствующее боиндефинирование после анализа конфигурации. Это также место, где различные рамки свободно абстрагированы. Например, некоторые рамки являются простыми и простыми, в то время как некоторые применяют некоторые шаблоны дизайна, такие как стратегии и декораторы, чтобы обеспечить большую гибкость.
После получения Beandefinition, поместите его во всем контексте, чтобы создать содержание Spring Bean, и мы проанализируем его позже.
Суммировать
Вышеуказанное - все содержание этой статьи. Я надеюсь, что содержание этой статьи имеет определенную справочную ценность для каждого обучения или работы. Если у вас есть какие -либо вопросы, вы можете оставить сообщение для общения. Спасибо за поддержку Wulin.com.