加载Bean定义方式-Xml版
下图上半部分是Xml中的Bean定义,下半部分是加载到Spring容器的Bean定义。
接下来我们看看Spring是如何加载的:
提示:
在refresh()中调用obtainFreshBeanFactory()中触发的。---第2步
下图是加载Xml中Bean定义的主流程:
下图是解析
下面是解析其他命名空间标签:
提示:
不要小看解析其他命名空间标签的支持,这是Spring提供的重要的扩展点之一。众多第三方技术与
Spring集成都使用到了该扩展点。以下以Dubbo为例,看它是怎么集成到Spring的。
1.实现BeanDefinitionParser接口,用于Bean定义解析。Dubbo提供了两个实现:
DubboBeanDefinitionParser
AnnotationBeanDefinitionParser
---与ComponentScanBeanDefinitionParser类似
2.实现NamespaceHandler接口,用于Bean定义解析的入口。Dubbo提供了一个实现:
DubboNamespaceHandler
---初始化中注册了Bean定义解析器(步骤1中解析器)
---与ContextNamespaceHandler类似
3.声明spring.handlers和spring.schemas
/src/main/resources/META-INF/spring.handlers
---声明命名空间url与命名空间解析器绑定关系
---Spring用来确定标签使用哪个NamespaceHandler
/src/main/resources/META-INF/spring.schemas
---声明标签Schema约束
到这里,Dubbo就可以共用Spring的基础设施了,主流程同与ContextNamespaceHandler类似。
以上是简化版逻辑,只描述了代码的主要逻辑,详情见源码。看完Xml版,我们再看下常用的注解方式定义Bean处理过程:加载Bean定义方式-注解版。
快速导航: