Spring源码笔记
Spring
Version:5.1.12
ApplicationContext
常用的实例化方式:
- ClassPathXmlApplicationContext
- FileSystemXmlApplicationContext
- XmlWebApplicationContext
通过Spring源码可见多钟方式进行实例化:

ClassPathXmlApplicationContext 比较常用的方式,通过加载xml文件实例化Spring容器,加载bean。
继承结构;
ClassPathXmlApplicationContext:

FileSystemXmlApplicationContext:

XmlWebApplicationContext:

Spring容器初始化过程
通过ClassPathXmlApplicationContext构造方法,调用了其父级AbstractXmlApplicationContext类中的refresh()方法;
1 public ClassPathXmlApplicationContext(
2 String[] configLocations, boolean refresh, @Nullable ApplicationContext parent)
3 throws BeansException {
4 //初始化父级容器
5 super(parent);
6 setConfigLocations(configLocations);
7 if (refresh) {
8 refresh(); //初始化工作
9 }
10 }
Spring容器初始化核心方法是refresh();该方法进行了准备环境、初始化容器、执行bean实例化、通知事件等操作。
refresh():
1 public void refresh() throws BeansException, IllegalStateException {
2 //该锁用于防止refresh和destory()同事进行
3 synchronized (this.startupShutdownMonitor) {
4 //容器初始化前,准备工作:
5 //设置状态、启动时间、实例化配置文件、准备环境
6 prepareRefresh();
7
8 // 获得beanFactory
9 /**
10 * 初始化DefaultListableBeanFactory beanFactory = createBeanFactory();
11 * getInternalParentBeanFactory() -- > getParent() --> return this.parent; this.parent 为null
12 * return new new DefaultListableBeanFactory();
13 */
14 ConfigurableListableBeanFactory beanFactory = obtainFreshBeanFactory();
15
16 // 配置BeanFactory context上下文环境
17 prepareBeanFactory(beanFactory);
18
19 try {
20 //BeanFactoryPostProcessor 后置处理操作
21 postProcessBeanFactory(beanFactory);
22
23 // 调用注册过的 BeanFactoryPostProcessor的相关方法
24 invokeBeanFactoryPostProcessors(beanFactory);
25
26 // 注册BeanPostProcessor
27 registerBeanPostProcessors(beanFactory);
28
29 //初始化国际化信息
30 initMessageSource();
31
32 // 初始化事件
33 initApplicationEventMulticaster();
34
35 // 调用子类实现的onRefresh方法
36 onRefresh();
37
38 // 注册监听
39 registerListeners();
40
41 // 初始化bean操作、注入属性、调用BeanPostProcessor后置处理器方法
42 finishBeanFactoryInitialization(beanFactory);
43
44 // 完成容器加载、执行通知事件
45 finishRefresh();
46 }
47 catch (BeansException ex) {
48 if (logger.isWarnEnabled()) {
49 logger.warn("Exception encountered during context initialization - " +
50 "cancelling refresh attempt: " + ex);
51 }
52 destroyBeans();
53
54 cancelRefresh(ex);
55 throw ex;
56 }
57 finally {
58 resetCommonCaches();
59 }
60 }
61 }
Spring容器简单描述可认为是一个BeanFactory,BeanFactory为一个顶层接口,Spring针对该接口作了大量的实现操作,不同的操作和功能通过大量的子类来进行实现;
Bean加载和初始化
在refresh方法中,Spring对Bean的加载和初始化分开进行,先加载bean的定义loadBeanDefinitions(),在最后才执行bean加载的操作为finishBeanFactoryInitialization();
bean的加载的方式有多种,上面提到的不同方式的容器子类,有classPath(xml方式) 、FileSystem(文件方式)、xmlWeb(远程加载xml)、Annotation(注解,SpringBoot的主要方式)等
Bean信息加载过程:

Bean实例化,finishBeanFactoryInitialization(),通过BeanDefinition Map中的信息逐个创建对象。ConfigurableListableBeanFactory.preInstantiateSingletons()该方法实例化所有懒加载的单例对象。由于懒加载的对象在使用时才根据BeanDefinition信息创建对象。对于scop ="prototype"的对象,Spring只负责创建,不负责管理,所以Spring容器初始化时没有创建懒加载和非单例对象。
Bean创建过程:

Spring循环依赖
目前Spring只支持单例bean通过Set方法和@Autowired注解的方式进行循环依赖。因为Spring通过构造来创建对象。在对象创建完成之后才进行属性设置。

FactoryBean
工厂Bean,接口类
1 public interface FactoryBean<T> {
2 //返回FactoryBean创建的bean实例,isSingleto返回true,则放入到Spring单例池中。
3 T getObject() throws Exception;
4 //返回FactoryBean创建的bean类型
5 Class<?> getObjectType();
6 //是否单例
7 boolean isSingleton();
8
9 }
未完待续。。。。。。。
Spring源码笔记的更多相关文章
- 厉害!这份阿里面试官 甩出的Spring源码笔记,GitHub上已经爆火
前言 时至今日,Spring 在 Java 生态系统与就业市场上,面试出镜率之高,投产规模之广,无出其右.随着技术的发展,Spring 从往日的 IoC 框架,已发展成 Cloud Native 基础 ...
- 【初学】Spring源码笔记之零:阅读源码
笔记要求 了解Java语言 了解Spring Framework的基础 会使用Maven 关于本笔记 起因 本职数据分析,为公司内部人员开发数据处理系统,使用了Python/Django+Bootst ...
- 首发!Alibaba内部:Spring源码培训课件笔记曝光!
本文包含的内容 Spring占有的市场 阅读源码的重要性 阅读源码困难度 课件笔记的主要内容 Spring占有的市场 先来简单说一下现在各个企业常用并与Spring相关的: ssh = spring ...
- Spring源码阅读笔记
前言 作为一个Java开发者,工作了几年后,越发觉力有点不从心了,技术的世界实在是太过于辽阔了,接触的东西越多,越感到前所未有的恐慌. 每天捣鼓这个捣鼓那个,结果回过头来,才发现这个也不通,那个也不精 ...
- Spring源码阅读笔记01:源码阅读环境准备
1. 写在前面 对于做Java开发的同学来说,Spring就像是一条绕不过去的路,但是大多数也只是停留在对Spring的简单使用层面上,对于其背后的原理所知不多也不愿深究,关于这个问题,我在平时的生活 ...
- Spring源码学习笔记9——构造器注入及其循环依赖
Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
随机推荐
- CentOS 7安装Nginx 1.10.2
安装epel-release源并进行安装 yum install epel-release yum update(时间会有点长) yum install nginx 相关操作: systemctl s ...
- 【题解】SP1811 LCS - Longest Common Substring
\(\color{purple}{Link}\) \(\text{Solution:}\) 题目要求找到两个串的最长公共子串.\(LCP\) 我们将两个串中间和末尾插入终止符,并弄到一棵后缀树上去. ...
- PHP添加新扩展包的步骤
1.找到PHP解压包,将 php.ini-development 这个文件复制一份,并修改后缀名为 .ini 2.将这个文件打开,将此处注释解开, 3.配置你扩展的该包的位置 4.如果显示不 ...
- Appium自动化测试之环境安装
安装前准备: Python 安装包下载 选择想要想在的python包Node-v6.11.2下载安卓SDK下载appium_forwindows下载 以上四个文件下载下来后,分别解压安装, ...
- Rolf Dobelli 《清醒思考的艺术》
为了避免输光自己靠勤奋积累的财产,罗尔夫·多贝里列了一份系统性思维错误的清单.这一份清单可以和查理·芒格的<人类误判心理学>对照查看. 自本杰明·富兰克林以来,电闪雷鸣没有减少变弱或响声变 ...
- vue中,使用 es6的 ` 符号给字符串之间换行
我这里分功能是点击"复制范围",就相当于复制图上的坐标点一样的数据和格式: "复制功能"的代码如下: copyPoints() { const vm = thi ...
- client: c#+protobuf, server: golang+protobuf
前段时间看到一篇博文<可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)>,他是用C#实现的即时通讯系统,功能强大,界面漂亮. 就想用golang重写服务端,把代码下载 ...
- 这类注解都不知道,还好意思说会Spring Boot ?
前言 不知道大家在使用Spring Boot开发的日常中有没有用过@Conditionalxxx注解,比如@ConditionalOnMissingBean.相信看过Spring Boot源码的朋友一 ...
- 单源文件目录makefile
目录结构 由于只是用来编译简单的小型程序,所以目录尽量简洁: . ├── build │ ├── bin │ ├── .dep │ └── obj ├── makefile └── src ...
- 身为电气人,为什么也要学习C语言编程?人生苦短,我学编程!
说起编程大家可能都听过,但编程究竟是怎么一回事你弄懂了吗? 编程=对计算机程序进行编写,这些程序可以是现在手里拿着的手机.办公的电脑.你点击的页面.浏览的网页,都是有程序让它执行你要它做的事情. PL ...