【Pigeon源码阅读】整合Spring配置文件自定义命名空间解析(二)

本文深入探讨了Pigeon如何通过自定义XML命名空间解析器处理Spring配置文件中的pigeon:xxx标签。从xml配置示例出发,详细解析了Spring源码中的自定义标签流程,包括Spring容器初始化、BeanDefinition的解析过程。接着,文章介绍了Pigeon自定义解析器的注册步骤,展示了BeanDefinitionParser与标签的映射关系。最后,详细阐述了Pigeon自定义解析器解析标签的具体步骤,特别是如何解析${}表达式并从配置中心获取值。
摘要由CSDN通过智能技术生成

1. xml文件配置示例

pigeon常用的配置方式是基于Spring Schema方式进行配置,pigeon自定义了一个xml命名空间解析器,用来解析以pigeon:xxx标志的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:pigeon="http://code.dianping.com/schema/pigeon"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
				http://code.dianping.com/schema/pigeon http://code.dianping.com/schema/pigeon/pigeon-service-2.0.xsd"
       default-autowire="byName">

    <!--定义独立的线程池 -->
    <pigeon:pool id="poolEcho" corePoolSize="5" maxPoolSize="20"
                 workQueueSize="50"/>


    <!-- 以服务方视角,定义一个pigeon服务,供客户端调用-->
    <pigeon:service
            url="com.dianping.pigeon.demo.EchoService"
            interface="com.dianping.pigeon.demo.EchoService"
            useSharedPool="false"
            ref="defaultEchoServiceImpl">
        <pigeon:method name="echo" pool="poolEcho"/>
    </pigeon:service>

    <!-- 定义一个pigeon服务器 -->
    <pigeon:server id="testServer" autoSelectPort="true" corePoolSize="150" httpPort="4080" maxPoolSize="300"
                   port="4040" suffix="test" workQueueSize="300"/>

    <!-- 扫描pigeon相关的注解属性,默认只扫描com.dianping包,如果非此包下的服务需要自定义package属性,多个package以逗号,分隔-->
    <pigeon:annotation id="testAnnotation" package="com.dianping"/>

    <!-- 以调用方视角,定义一个pigeon服务引用,通过RPC调用远程服务方服务-->
    <pigeon:reference id="echoServiceWithCallback"
                      interface="com.dianping.pigeon.demo.EchoService"
                      url="com.dianping.pigeon.demo.EchoService"
                      timeout="1000" protocol="default" serialize="hessian" callType="callback"
                      callback="echoServiceCallback"/>

</beans>

2. spring源码解析自定义标签流程

下面通过分析源码看pigeon是如何解析这些标签的。
基于以下测试代码在Spring容器中运行:

public static void main(String[] args) throws Exception {
   
    ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("classpath*:META-INF/spring/schema/provider.xml");

    System.in.read();
}

分析Spring源码,在初始化容器解析xml,会经过以下路径:

  1. 调用ClassPathXmlApplicationContext构造函数
public ClassPathXmlApplicationContext(String configLocation) throws BeansException {
   
	this(new String[] {
   configLocation}, true, null);
}
//紧接着调用
ublic ClassPathXmlApplicationContext(String[] configLocations, boolean refresh, ApplicationContext parent)
		throws BeansException {
   

	super(parent);
	// 保存配置文件路径
	setConfigLocations(configLocations);
	if
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值