Предыдущая статьяПоговорим о механизме расширения в Spring (1)болталиApplicationListener
,ApplicationContextAware
,BeanFactoryAware
три механизма. Эта статья познакомитNamespaceHandler
расширенное использование.
Я полагаю, что многие мелкие партнеры знакомы с этими категориями, в основном на основеjava
осуществленныйRPC
будут использоваться фреймворки, такие какDubbo , SOFARpcЖдать. Эта статья начинается с нескольких небольшихdemo
Начните, разберитесь с основными понятиями и процессом программирования, а затем проанализируйтеSOFARpc
как используется.
NamespaceHandler
NamespaceHandler
даSpring
Предоставленный обработчик пространства имен. На картинке ниже, кроме случайного входаdemo
участвует вBridgeNameSpaceHandler
, Кроме какSpring
предоставлено само собой.
bean
иcontext
зависимости, так что это только часть. На картинке то, что мы обычно используем, должно бытьAopNamespaceHandler
.
Мы используем на основеxml
изspring
При настройке может потребоваться настроить, например,<aop:config />
Такая метка, прежде чем настраивать эту метку, обычно нам нужно ввести этоaop
В пространстве имен:
<?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:aop="http://www.springframework.org/schema/aop"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd" />
Узнайте больше об АОППоговорим об АОП: представление и основные понятия, здесь не так много пояснений, дальше будет следующееПроцесс официальной документациинаписать обычайxml
, окончательный эффект выглядит следующим образом:
<bridge:application id="bridgeTestApplication"
name="bridgeTestApplication"
version="1.0"
organization="bridge.glmapper.com"
owner="leishu@glmapper"/>
1. Определите файл xsd
оxsd
Грамматические правила файла выходят за рамки этой статьи, и заинтересованные студенты могут составить свои собственные правила.google
.
Следующий файл очень прост, определениеelement
имяapplication
, соответствующийbridge:application
серединаapplication
.attribute
Это соответствующие имена атрибутов на приведенном выше дисплее эффектов.
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"
xmlns:beans="http://www.springframework.org/schema/beans"
xmlns:tool="http://www.springframework.org/schema/tool"
xmlns="http://bridge.glmapper.com/schema/bridge"
targetNamespace="http://bridge.glmapper.com/schema/bridge">
<xsd:import namespace="http://www.springframework.org/schema/beans"/>
<xsd:complexType name="applicationType">
<xsd:attribute name="id" type="xsd:ID"/>
<xsd:attribute name="name" type="xsd:string" use="required"/>
<xsd:attribute name="version" type="xsd:string"/>
<xsd:attribute name="owner" type="xsd:string"/>
<xsd:attribute name="organization" type="xsd:string"/>
</xsd:complexType>
<xsd:element name="application" type="applicationType"/>
</xsd:schema>
2. Напишите обработчик пространства имен
In addition to the schema, we need a NamespaceHandler that will parse all elements of this specific namespace Spring encounters while parsing configuration files.
написано с этимNamespaceHandler
разбирать файл конфигурации.
КонкретноNamespaceHandler
будет основываться наschema
и имя узла, чтобы найтиBeanDefinitionParser
, затем поBeanDefinitionParser
Выполните конкретную аналитическую работу.
Spring
Предоставляется класс реализации по умолчаниюNamespaceHandlerSupport
иAbstractSingleBeanDefinitionParser
, проще всего наследовать эти два класса.
Здесь по наследствуNamespaceHandlerSupport
Этот абстрактный класс готов.
public class BridgeNamespaceHandler extends NamespaceHandlerSupport {
public void init() {
registerBeanDefinitionParser("application",
new ApplicationBeanDefinitionParser());
}
}
Вот собственно просто парсер прописал, конкретныйBeanDefinitionParser
будетXML
Элементы сопоставляются с определеннымиbean
из.
3. Напишите BeanDefinitionParser
Здесь непосредственно через реализациюBeanDefinitionParser
То, как интерфейс определяет нашуBeanDefinitionParser
Класс реализации. оAbstractSingleBeanDefinitionParser
используется вSPFARpc
будет задействован.
public class ApplicationBeanDefinitionParser implements BeanDefinitionParser {
public BeanDefinition parse(Element element, ParserContext parserContext) {
//beanDefinition
RootBeanDefinition beanDefinition = new RootBeanDefinition();
beanDefinition.setBeanClass(ApplicationConfig.class);
beanDefinition.setLazyInit(false);
//解析id
String id = element.getAttribute("id");
beanDefinition.getPropertyValues().add("id", id);
//解析name
beanDefinition.getPropertyValues().add("name",
element.getAttribute("name"));
//解析version
beanDefinition.getPropertyValues().add("version",
element.getAttribute("version"));
//owner
beanDefinition.getPropertyValues().add("owner",
element.getAttribute("owner"));
//organization
beanDefinition.getPropertyValues().add("organization",
element.getAttribute("organization"));
parserContext.getRegistry().registerBeanDefinition(id, beanDefinition);
return beanDefinition;
}
}
Здесь нам нужно понять, что когда мы начинаем анализировать пользовательские теги, мы передаемBeanDefinitionParserDelegate->parseCustomElement
метод, как показано на следующем рисунке:
пройти черезele
элемент получает текущийnamespaceUri
, то есть вxsd
пространства имен, определенные в , а затем делегироватьDefaultNamespaceResolver
уточнитьhandler
(BridgenamspaceHandler
),
然后执行parse
Разбор.
4. Настройте spring.handlers и spring.schmas
http\://bridge.glmapper.com/schema/bridge=
com.glmapper.extention.namespacehandler.BridgeNamespaceHandler
http\://bridge.glmapper.com/schema/bridge.xsd=META-INF/bridge.xsd
Настройка этого на самом деле сделатьSpring
разборxml
Когда мы сможем воспринимать наш пользовательский элемент, нам нужно поместитьNamespaceHandler
иxsd
Расположен в файле в каталог Meta-infspring.handlers
иspring.schmas
в файле. так что вspring
Наши пользовательские теги используются в файле конфигурации. следующее:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:bridge="http://bridge.glmapper.com/schema/bridge"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://bridge.glmapper.com/schema/bridge
http://bridge.glmapper.com/schema/bridge.xsd">
<bridge:application id="bridgeTestApplication"
name="bridgeTestApplication"
version="1.0"
organization="bridge.glmapper.com"
owner="leishu@glmapper"/>
</beans>
Подтвердить, чтобы получить наш из контейнераbean
:
public static void main(String[] args) {
ApplicationContext applicationContext = new
ClassPathXmlApplicationContext("classpath:bean.xml");
ApplicationConfig applicationConfig = (ApplicationConfig)
applicationContext.getBean("bridgeTestApplication");
System.out.println("applicationConfig = "+applicationConfig);
}
Пример вывода:
applicationConfig = ApplicationConfig {
id=bridgeTestApplication,
name='bridgeTestApplication',
version='1.0',
owner='leishu@glmapper',
organization='bridge.glmapper.com'
}
В целом, если мы хотим достичьxml
Теги, просто выполните следующие шаги:
- 1. Определите файл xsd
- 2. Напишите обработчик пространства имен
- 3. Напишите BeanDefinitionParser
- 4. Настройте spring.handlers и spring.schmas
Анализ использования в SOFARpc
SOFARpc
серединаrpc.xsd
файл интегрирован вsofaboot.xsd
В файле подробно видно:sofa-boot
xsd
Файл не выложен здесь, он немного длинный
spring.handlers и spring.schmas
Первый взглядspring.handlers
иspring.schmas
Конфигурация:
http\://sofastack.io/schema/sofaboot=
com.alipay.sofa.infra.config.spring.namespace.handler.SofaBootNamespaceHandler
http\://sofastack.io/schema/sofaboot.xsd=
META-INF/com/alipay/sofa/infra/config/spring/namespace/schema/sofaboot.xsd
http\://sofastack.io/schema/rpc.xsd=
META-INF/com/alipay/sofa/infra/config/spring/namespace/schema/rpc.xsd
отspring.handlers
оказатьсяNamespaceHandler
: SofaBootNamespaceHandler
.
SofaBootNamespaceHandler
Исходный код выглядит следующим образом.Здесь видно, что он не такой, как мы писали выше, будетBeanDefinitionParser
. На самом деле здесь очень продумано.spi
способ загрузки конкретногоBeanDefinitionParser
.
public class SofaBootNamespaceHandler extends NamespaceHandlerSupport {
@Override
public void init() {
ServiceLoader<SofaBootTagNameSupport> serviceLoaderSofaBoot =
ServiceLoader.load(SofaBootTagNameSupport.class);
//SOFABoot
for (SofaBootTagNameSupport tagNameSupport : serviceLoaderSofaBoot) {
this.registerTagParser(tagNameSupport);
}
}
private void registerTagParser(SofaBootTagNameSupport tagNameSupport) {
if (!(tagNameSupport instanceof BeanDefinitionParser)) {
// log
return;
}
String tagName = tagNameSupport.supportTagName();
registerBeanDefinitionParser(tagName, (BeanDefinitionParser)
tagNameSupport);
}
}
Здесь видно, что естьReferenceDefinitionParser
иServiceDefinitionParser
Два класса синтаксического анализа, соответствующие ссылке на службу и представлению службы соответственно.
Ниже сReferenceDefinitionParser
Например, сначала посмотрите на его диаграмму классов:
Аналитическая работа находится вAbstractContractDefinitionParser
сделано на уроке,ReferenceDefinitionParser
Я только что выполнил специальную обработку [jvm-first, jvm service].
резюме
Эта статья прошлаNamespaceHandler
Узнали, как писать наши пользовательские теги xml, изNamespaceHandler
Угол обзора можно хорошо понятьRPC
Основная часть фреймворка основана наxml
Способы обращения к сервису и представления идей реализации. Кроме того, анализируяSOFARpc
, также понимать, что в реальных инженерных компонентах дляNamespaceHandler
расширенное использование.
Код для этой статьи:glmapper-spring-extention