spring源码学习 - 注解bean的初始化过程

原创 2017年01月03日 22:25:14
解析方式

上一篇文章中提到spring初始化进行配置解析的时候会根据命名空间来选择不同的解析方式
- 当命名空间是"http://www.springframework.org/schema/beans"时选择默认的解析方式进行解析
- 其他类型会选择自定义的方式进行解析.比如:

<context:component-scan>的命名空间是:http://www.springframework.org/schema/context
<task:executor>的命名空间是:"http://www.springframework.org/schema/task"
<aop:aspectj-autoproxy>的命名空间是:"http://www.springframework.org/schema/aop"

配置扫描器

当我们要使用@service @Repository @Component ,通常需要配置一个扫描器类似

回到问题

当在一个javaBean上标注@service时spring初始化做了什么?

下面开始debug源码
  1. 创建javaBean并进行@service标注
    Paste_Image.png
  2. 准备单元测试类
  3. 跟踪源码来到DefaultBeanDefinitionDocumentReader中的parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate):
    Paste_Image.png
  4. 循环解析过程中节点对象Element命名空间为http://www.springframework.org/schema/context的时候开始进入自定义解析模式 ,最后来到BeanDefinitionParserDelegate中的parseCustomElement(Element ele, BeanDefinition containingBd)方法:
    Paste_Image.png
  5. 看下spring获取解析处理器的过程,整个过程非常的简单粗暴:直接解析spring类路径下所有的META-INF/spring.handlers配置文件,然后放入map当中.注意下这里的map中的key实际上String类型的,只有当该处理器第一次被使用的时候才会通过反射创建出真实的处理器对象

  6. 到这里,spring对于自定义bean的解析和注册开始委托给了NamespaceHandler类,最终被委托给了ComponentScanBeanDefinitionParser,主要分为三个过程:

    • 处理我们在配置文件中定义的扫描路径

    - 扫描出所有的注解bean,并进行注册

  7. 进入Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages);,生成容器数据对象并进行注册,主要分三个过程:

    • 扫描类路径下符合要求的class,获取class的元数据,组装基础容器数据对象ScannedGenericBeanDefinition,
    • 设置一系列的属性
    • 向容器进行注册,到这里就完成注解bean的注册
  8. 回到上一步看到还有registerComponents(parserContext.getReaderContext(), beanDefinitions, element)这一个过程,为什么要有这个过程呢?因为单单注册我们注解定义的bean还不够,还会涉及到一些内部依赖处理器bean也要进行构建和注册,因为bean的内部还可以依赖另一个bean,可以看一下整个注册过程完成后容器中DefaultListableBeanFactory.beanDefinitionMap结构
    Paste_Image.png

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以...

mybatis-Spring ClassPathMapperScanner源码分析(自定义注解加载Bean)

摘要: 在使用mybatis时,可以通过mybatis-spring的MapperFactoryBean来配置一系列的DAO接口,MapperFactoryBean的getObject方法能返回DA...

Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以...

Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

1.从Spring2.0以后的版本中,spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以...

Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以...

Spring对注解(Annotation)处理源码分析1——扫描和读取Bean定义

1.从Spring2.0以后的版本中,Spring也引入了基于注解(Annotation)方式的配置,注解(Annotation)是JDK1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以...

spring源码学习之路---IOC容器初始化要义之bean定义载入(五)

作者:zuoxiaolong8810(左潇龙),转载请注明出处。             最近工作很忙,时间不多,研究spring的进度被严重拖下来,不过我会一直坚持写完。  ...

看看Spring的源码(一)——Bean加载过程

本文转自独立博客:Geeekr 最近几天跟同事聊起Spring的一些问题,对一些地方有些疑问,趁这两天有点空,看看Spring的源码,了解下具体的实现细节。本文基于Spring 4.0.5版本。...

Spring源码阅读——Bean的加载和获取过程

我们经常使用Spring,并且也都了解其大概原理。我想我们一定会对Spring源码的解读有迫切的渴望。 我也如此。所以,我打算阅读一下Spring的源码。再此之前,我也为此准备了很多。包括,去复习熟练...

看看Spring的源码——Bean加载过程

首先Web项目使用Spring是通过在web.xml里面配置org.springframework.web.context.ContextLoaderListener初始化IOC容器的。 liste...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)