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】——Spring IOC(二):初始化过程—简介

首先我们先来看看如下一段代码ClassPathResource resource = new ClassPathResource("bean.xml"); DefaultListabl...
  • chenssy
  • chenssy
  • 2016年06月12日 18:33
  • 3908

[开源框架推荐]jsDraw2D: 功能强大的js绘图框架

jsDraw2D是jsFiction公司提供的第一个产品,他们计划创造各种各样的革命性的JavaScript库和应用,来帮助JavaScript 开发者,Web开发者以及Web站长扩展JavaScri...
  • KimmKing
  • KimmKing
  • 2012年12月07日 10:57
  • 10817

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

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

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的配置,某些场合可以...
  • lcczzu
  • lcczzu
  • 2015年07月16日 10:52
  • 411

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

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

spring 注解源码分析-扫描和读取bean定义

1.概述 从spring2.0以后的版本中,spring也引入了基于注解方式的配置,注解是jdk1.5中引入的一个新特性,用于简化Bean的配置,某些场合可以取代xml配置文件。 Spring I...

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

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

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

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

Spring源码学习--Bean对象初始化(二)

即使我们在不了解Spring对bean的初始化机制,我们也可以根据Java语言的特性猜测到其很有可能是通过反射机制来完成Bean的初始化操作,接下来我们一步一步的剖析Spring对Bean的初始化操作...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:spring源码学习 - 注解bean的初始化过程
举报原因:
原因补充:

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