bl双性强迫侵犯h_国产在线观看人成激情视频_蜜芽188_被诱拐的少孩全彩啪啪漫画

Spring中XMLschema擴(kuò)展機(jī)制的原理是什么

Spring中XML schema擴(kuò)展機(jī)制的原理是什么?相信很多沒(méi)有經(jīng)驗(yàn)的人對(duì)此束手無(wú)策,為此本文總結(jié)了問(wèn)題出現(xiàn)的原因和解決方法,通過(guò)這篇文章希望你能解決這個(gè)問(wèn)題。

在鎮(zhèn)平等地區(qū),都構(gòu)建了全面的區(qū)域性戰(zhàn)略布局,加強(qiáng)發(fā)展的系統(tǒng)性、市場(chǎng)前瞻性、產(chǎn)品創(chuàng)新能力,以專(zhuān)注、極致的服務(wù)理念,為客戶(hù)提供成都網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站 網(wǎng)站設(shè)計(jì)制作按需網(wǎng)站策劃,公司網(wǎng)站建設(shè),企業(yè)網(wǎng)站建設(shè),高端網(wǎng)站設(shè)計(jì),成都營(yíng)銷(xiāo)網(wǎng)站建設(shè),成都外貿(mào)網(wǎng)站制作,鎮(zhèn)平網(wǎng)站建設(shè)費(fèi)用合理。

自定義 XML 擴(kuò)展

為了搞懂 Spring 的 XML 擴(kuò)展機(jī)制,最直接的方式便是實(shí)現(xiàn)一個(gè)自定義的擴(kuò)展。實(shí)現(xiàn)的步驟也非常簡(jiǎn)單,分為四步:

Spring中XML schema擴(kuò)展機(jī)制的原理是什么

  • 編寫(xiě)一個(gè) XML schema 文件描述的你節(jié)點(diǎn)元素。

  • 編寫(xiě)一個(gè) NamespaceHandler 的實(shí)現(xiàn)類(lèi)

  • 編寫(xiě)一個(gè)或者多個(gè) BeanDefinitionParser 的實(shí)現(xiàn) (關(guān)鍵步驟).

  • 注冊(cè)上述的 schema 和 handler。

我們的目的便是想要實(shí)現(xiàn)一個(gè) kirito XML schema,我們的項(xiàng)目中可以自定義 kirito.xml,在其中會(huì)以 kirito 為標(biāo)簽來(lái)定義不同的類(lèi),并在最終的測(cè)試代碼中驗(yàn)證這些聲明在 kirito.xml 的類(lèi)是否被 Spring 成功加載。大概像這樣,是不是和 dubbo.xml 的格式很像呢?

Spring中XML schema擴(kuò)展機(jī)制的原理是什么

動(dòng)手實(shí)現(xiàn)

有了明確的目標(biāo),我們逐步開(kāi)展自己的工作。

1 編寫(xiě)kirito.xsd

resources/META-INF/kirito.xsd

<?xml version="1.0" encoding="UTF-8"?>
<xsd:schema xmlns="http://www.cnkirito.moe/schema/kirito"
   xmlns:xsd="http://www.w3.org/2001/XMLSchema"
   xmlns:beans="http://www.springframework.org/schema/beans"
   targetNamespace="http://www.cnkirito.moe/schema/kirito"> ①

 <xsd:import namespace="http://www.springframework.org/schema/beans"/>

 <xsd:element name="application"> ②
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="beans:identifiedType">
     <xsd:attribute name="name" type="xsd:string" use="required"/>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>

 <xsd:element name="service"> ②
  <xsd:complexType>
   <xsd:complexContent>
    <xsd:extension base="beans:identifiedType">
     <xsd:attribute name="name" type="xsd:string" use="required"/>
    </xsd:extension>
   </xsd:complexContent>
  </xsd:complexType>
 </xsd:element>


</xsd:schema>

① 注意這里的 targetNamespace="http://www.cnkirito.moe/schema/kirito" 這便是之后 kirito 標(biāo)簽的關(guān)鍵點(diǎn)。

② kirito.xsd 定義了兩個(gè)元素: application 和 service,出于簡(jiǎn)單考慮,都只有一個(gè) name 字段。

schema 的意義在于它可以和 eclipse/IDEA 這樣智能化的集成開(kāi)發(fā)環(huán)境形成很好的搭配,在編輯 XML 的過(guò)程中,用戶(hù)可以獲得告警和提示。 如果配置得當(dāng),可以使用自動(dòng)完成功能讓用戶(hù)在事先定義好的枚舉類(lèi)型中進(jìn)行選擇。

2 編寫(xiě)KiritoNamespaceHandler

public class KiritoNamespaceHandler extends NamespaceHandlerSupport {

 @Override
 public void init() {
  super.registerBeanDefinitionParser("application", new KiritoBeanDefinitionParser(ApplicationConfig.class));
  super.registerBeanDefinitionParser("service", new KiritoBeanDefinitionParser(ServiceBean.class));
 }
}

完成 schema 之后,還需要一個(gè) NamespaceHandler 來(lái)幫助 Spring 解析 XML 中不同命名空間的各類(lèi)元素。

<kirito:application name="kirito"/>
<dubbo:application name="dubbo"/>
<motan:application name="motan"/>

不同的命名空間需要不同的 NamespaceHandler 來(lái)處理,在今天的示例中,我們使用 KiritoNamespaceHandler 來(lái)解析 kirito 命名空間。KiritoNamespaceHandler 繼承自 NamespaceHandlerSupport 類(lèi),并在其 init() 方法中注冊(cè)了兩個(gè) BeanDefinitionParser ,用于解析 kirito 命名空間/kirito.xsd 約束中定義的兩個(gè)元素:application,service。BeanDefinitionParser 是下一步的主角,我們暫且跳過(guò),將重心放在父類(lèi) NamespaceHandlerSupport 之上。

public interface NamespaceHandler {
 void init();
 BeanDefinition parse(Element element, ParserContext parserContext);
 BeanDefinitionHolder decorate(Node source, BeanDefinitionHolder definition, ParserContext parserContext);
}

NamespaceHandlerSupport 是 NamespaceHandler 命名空間處理器的抽象實(shí)現(xiàn),我粗略看了NamespaceHandler 的幾個(gè)實(shí)現(xiàn)類(lèi),parse 和 decorate 方法可以完成元素節(jié)點(diǎn)的組裝并通過(guò) ParserContext 注冊(cè)到 Ioc 容器中,但實(shí)際我們并沒(méi)有調(diào)用這兩個(gè)方法,而是通過(guò) init() 方法注冊(cè) BeanDefinitionParser 來(lái)完成解析節(jié)點(diǎn)以及注冊(cè) Bean 的工作,所以對(duì)于 NamespaceHandler,我們主要關(guān)心 init 中注冊(cè)的兩個(gè) BeanDefinitionParser 即可。

3 編寫(xiě)KiritoBeanDefinitionParser

在文章開(kāi)始我們便標(biāo)記到 BeanDefinitionParser 是最為關(guān)鍵的一環(huán),每一個(gè) BeanDefinitionParser 實(shí)現(xiàn)類(lèi)都負(fù)責(zé)一個(gè)映射,將一個(gè) XML 節(jié)點(diǎn)解析成 IOC 容器中的一個(gè)實(shí)體類(lèi)。

public class KiritoBeanDefinitionParser implements BeanDefinitionParser {

 private final Class<?> beanClass;

 public KiritoBeanDefinitionParser(Class<?> beanClass) {
  this.beanClass = beanClass;
 }

 private static BeanDefinition parse(Element element, ParserContext parserContext, Class<?> beanClass) {
  RootBeanDefinition beanDefinition = new RootBeanDefinition();
  beanDefinition.setBeanClass(beanClass);
  beanDefinition.setLazyInit(false);
  String name = element.getAttribute("name");
  beanDefinition.getPropertyValues().addPropertyValue("name", name);
  parserContext.getRegistry().registerBeanDefinition(name, beanDefinition);
  return beanDefinition;
 }

 @Override
 public BeanDefinition parse(Element element, ParserContext parserContext) {
  return parse(element, parserContext, beanClass);
 }
}

由于我們的實(shí)體類(lèi)是非常簡(jiǎn)單的,所以不存在很復(fù)雜的解析代碼,而實(shí)際項(xiàng)目中,往往需要大量的解析步驟。parse 方法會(huì)解析一個(gè)個(gè) XML 中的元素,使用 RootBeanDefinition 組裝成對(duì)象,并最終通過(guò) parserContext 注冊(cè)到 IOC 容器中。

至此,我們便完成了 XML 文件中定義的對(duì)象到 IOC 容器的映射。

4 注冊(cè)schema和handler

最后一步還需要通知 Spring,告知其自定義 schema 的所在之處以及對(duì)應(yīng)的處理器。

resources/META-INF/spring.handlers

http\://www.cnkirito.moe/schema/kirito=moe.cnkirito.sample.xsd.KiritoNamespaceHandler

resources/META-INF/spring.schemas

http\://www.cnkirito.moe/schema/kirito/kirito.xsd=META-INF/kirito.xsd

沒(méi)有太多可以說(shuō)的,需要遵守 Spring 的約定。

至此一個(gè)自定義的 XML schema 便擴(kuò)展完成了,隨后來(lái)驗(yàn)證一下。

驗(yàn)證擴(kuò)展

我們首先定義好 kirito.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:kirito="http://www.cnkirito.moe/schema/kirito"
  xsi:schemaLocation=" http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.cnkirito.moe/schema/kirito
        http://www.cnkirito.moe/schema/kirito/kirito.xsd">

 <kirito:application name="kirito-demo-application"/>

 <kirito:service name="kirito-demo-service"/>

</beans>

使用 Spring 去加載它,并驗(yàn)證 IOC 容器中是否存在注冊(cè)成功的 Bean。

@SpringBootApplication
@ImportResource(locations = {"classpath:kirito.xml"})
public class XmlSchemaAuthoringSampleApplication {

 public static void main(String[] args) {
  ConfigurableApplicationContext applicationContext = SpringApplication.run(XmlSchemaAuthoringSampleApplication.class, args);
  ServiceBean serviceBean = applicationContext.getBean(ServiceBean.class);
  System.out.println(serviceBean.getName());
  ApplicationConfig applicationConfig = applicationContext.getBean(ApplicationConfig.class);
  System.out.println(applicationConfig.getName());
 }
}

觀察控制臺(tái)的輸出:

kirito-demo-service
kirito-demo-application

一個(gè)基礎(chǔ)的基于 XML schema 的擴(kuò)展便完成了。

Dubbo中的XML schema擴(kuò)展

最后我們以 Dubbo 為例,看看一個(gè)成熟的 XML schema 擴(kuò)展是如何被應(yīng)用的。

Spring中XML schema擴(kuò)展機(jī)制的原理是什么

看完上述內(nèi)容,你們掌握Spring中XML schema擴(kuò)展機(jī)制的原理是什么的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀!

分享文章:Spring中XMLschema擴(kuò)展機(jī)制的原理是什么
分享路徑:http://vcdvsql.cn/article22/pdecjc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)、企業(yè)建站、ChatGPT、網(wǎng)站內(nèi)鏈、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

h5響應(yīng)式網(wǎng)站建設(shè)