-
Spring 基于Schema扩展
由于xml格式具有很好的自说明便于编写及维护,Spring中bean的定义主要是通过xml形式。而对于xml的文档结构、数据定义及格式验证则是采用Schema。使用Schema方式使得spring更加便于与第三方进行集成以及第三方可以提供更简单更便于使用的个性化配置方式。对于XmlSchema具体知识这里不做介绍,但是Schema中有个重要的概念命名空间(namespace)必须要提一下,spring就是利用它来做第三方自定配置格式的解析的,在spring中aop, transaction的就是给第三一个实现自己自定义配置很好实例。
命名空间
Schema中有个重要的概念:命名空间(namespace),spring就是利用它来做第三方自定配置格式的解析的。
如上图:xmlns=”http://www.springframework.org/schema/beans”是默认命名空间xmlns:aop=”http://www.springframework.org/schema/aop” 定义了aop的命名空间
而各命名空间下的格式定义文件通过xsi:schemaLocation来指定。
当spring启动时,会把xml配置文件当做一个文档格式来读取,每读取一个元素节点都会判断下这个元素的命名空间,如果是默认命名空间(http://www.springframework.org/schema/beans)则按默认方式读取bean的定义, 如果不是如namespaceUri如下http://www.springframework.org/schema/aop,
http://www.springframework.org/schema/tx,
则走解析自定义元素流程。根据命名空间去获取具体的处理器NamespaceHandler。那具体的处理器是在哪定义的呢,在”META-INF/spring.handlers”文件中,Spring在会自动加载该文件中所有内容。
-
dubbo与spring的整合
如上2图,dubbo指定了DubboNamespaceHandler类来处理dubbo命名空间对应的元素。
DubboNamespaceHandler中注册了这么多的BeanDefinitionParser用来解析dubbo定义的那些xml元素节点如:
<dubbo:application />
<dubbo:registry />
<dubbo:reference />
<dubbo:service />
各个BeanDefinitionParser会把上面的xml元素转换成spring内部的数据结构BeanDefinition,最终当被引用时实例化成对应的bean。
如<dubbo:application/>节点最终会得到ApplicationConfig类.
-
dubbo的启动顺序
Main类中首先会实例化一个ExtensionLoader<Container>类型的容器加载器,同时会加载Container接口的所有可用扩展点。
Main.main()
SpringContainer.start()if (args == null || args.length == 0) { String config = ConfigUtils.getProperty(CONTAINER_KEY, loader.getDefaultExtensionName()); args = Constants.COMMA_SPLIT_PATTERN.split(config); } final List<Container> containers = new ArrayList<Container>(); for (int i = 0; i < args.length; i ++) { containers.add(loader.getExtension(args[i])); } ….. for (Container container : containers) { container.start(); logger.info("Dubbo " + container.getClass().getSimpleName() + " started!"); }
String configPath = ConfigUtils.getProperty(SPRING_CONFIG); if (configPath == null || configPath.length() == 0) { configPath = DEFAULT_SPRING_CONFIG; } context = new ClassPathXmlApplicationContext(configPath.split("[,\\s]+")); context.start();
然后在main()方法中会根据 main方法参数>配置文件>SPI注解默认值的优先级顺序获取到所需的扩展点并启动,由于初始任务主要在Spring中完成,所以我们只关注SpringContainer的启动即可。
dubbo学习(二)-dubbo与spring的整合及启动顺序
最新推荐文章于 2024-05-31 14:14:19 发布