spring源码学习 - 注解bean的初始化过程
来源:互联网 发布:魔兽任务数据库 编辑:程序博客网 时间:2024/05/21 09:53
解析方式
上一篇文章中提到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源码
- 创建javaBean并进行@service标注
- 准备单元测试类
- 跟踪源码来到
DefaultBeanDefinitionDocumentReader
中的parseBeanDefinitions(Element root, BeanDefinitionParserDelegate delegate)
: - 循环解析过程中节点对象
Element
命名空间为http://www.springframework.org/schema/context
的时候开始进入自定义解析模式 ,最后来到BeanDefinitionParserDelegate
中的parseCustomElement(Element ele, BeanDefinition containingBd)
方法: - 看下spring获取解析处理器的过程,整个过程非常的简单粗暴:直接解析spring类路径下所有的
META-INF/spring.handlers
配置文件,然后放入map当中.注意下这里的map中的key实际上String类型的,只有当该处理器第一次被使用的时候才会通过反射创建出真实的处理器对象
到这里,spring对于自定义bean的解析和注册开始委托给了
NamespaceHandler
类,最终被委托给了ComponentScanBeanDefinitionParser
,主要分为三个过程:- 处理我们在配置文件中定义的扫描路径
- 扫描出所有的注解bean,并进行注册
进入
Set<BeanDefinitionHolder> beanDefinitions = scanner.doScan(basePackages);
,生成容器数据对象并进行注册,主要分三个过程:- 扫描类路径下符合要求的class,获取class的元数据,组装基础容器数据对象ScannedGenericBeanDefinition,
- 设置一系列的属性
- 向容器进行注册,到这里就完成注解bean的注册
回到上一步看到还有
registerComponents(parserContext.getReaderContext(), beanDefinitions, element)
这一个过程,为什么要有这个过程呢?因为单单注册我们注解定义的bean还不够,还会涉及到一些内部依赖处理器bean也要进行构建和注册,因为bean的内部还可以依赖另一个bean,可以看一下整个注册过程完成后容器中DefaultListableBeanFactory.beanDefinitionMap
结构
- spring源码学习 - 注解bean的初始化过程
- spring源码学习 - 配置文件bean的初始化
- Spring Bean 初始化过程
- Spring Bean 初始化过程
- Spring Bean 初始化过程
- Spring Bean 初始化过程
- Spring Bean 初始化过程
- Spring Bean初始化过程
- Spring Bean初始化过程
- spring bean初始化过程
- Spring中Bean的初始化过程
- 关于Spring 中初始化bean的过程
- spring中bean的初始化过程
- spring中bean初始化过程
- spring中bean初始化过程
- spring中bean初始化过程
- Spring中Bean初始化过程
- Spring 初始化bean过程图解
- 01背包之贪心选择
- 怎么使用easy_ui搭建后台ui--初试牛刀(下)管理页面的搭建以及数据的增删查改实现
- Python与机器学习1
- MFC使窗口弹出时显示在屏幕中间或屏幕左上角
- gdb调试技巧
- spring源码学习 - 注解bean的初始化过程
- 基于android的家庭收支管理软件
- Python爬虫基础细节(urllib+cookielib+BeautifulSoup)
- 解决IIS下UTF-8文件报错乱码的问题
- KAOS-智能交通系统软件需求说明书
- 反射用法
- Android-->如何将RecyclerView打造成ViewPager的效果
- Git详解之二:Git基础
- 信息抽取技术及前景浅析读后感