下图上半部分是Xml中的Bean定义,下半部分是加载到Spring容器的Bean定义。

查看大图

加载Bean定义

接下来我们看看Spring是如何加载的:

提示:
    在refresh()中调用obtainFreshBeanFactory()中触发的。---第2步

下图是加载Xml中Bean定义的主流程:

查看大图

加载Bean定义---主流程

下图是解析标签的流程:

查看大图

加载Bean定义---解析<bean>标签

下面是解析其他命名空间标签:

查看大图

加载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定义方式-注解版

快速导航: