Spring

  Version:5.1.12

  ApplicationContext

  常用的实例化方式:

  1.   ClassPathXmlApplicationContext
  2.   FileSystemXmlApplicationContext
  3.   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源码笔记的更多相关文章

  1. 厉害!这份阿里面试官 甩出的Spring源码笔记,GitHub上已经爆火

    前言 时至今日,Spring 在 Java 生态系统与就业市场上,面试出镜率之高,投产规模之广,无出其右.随着技术的发展,Spring 从往日的 IoC 框架,已发展成 Cloud Native 基础 ...

  2. 【初学】Spring源码笔记之零:阅读源码

    笔记要求 了解Java语言 了解Spring Framework的基础 会使用Maven 关于本笔记 起因 本职数据分析,为公司内部人员开发数据处理系统,使用了Python/Django+Bootst ...

  3. 首发!Alibaba内部:Spring源码培训课件笔记曝光!

    本文包含的内容 Spring占有的市场 阅读源码的重要性 阅读源码困难度 课件笔记的主要内容 Spring占有的市场 先来简单说一下现在各个企业常用并与Spring相关的: ssh = spring ...

  4. Spring源码阅读笔记

    前言 作为一个Java开发者,工作了几年后,越发觉力有点不从心了,技术的世界实在是太过于辽阔了,接触的东西越多,越感到前所未有的恐慌. 每天捣鼓这个捣鼓那个,结果回过头来,才发现这个也不通,那个也不精 ...

  5. Spring源码阅读笔记01:源码阅读环境准备

    1. 写在前面 对于做Java开发的同学来说,Spring就像是一条绕不过去的路,但是大多数也只是停留在对Spring的简单使用层面上,对于其背后的原理所知不多也不愿深究,关于这个问题,我在平时的生活 ...

  6. Spring源码学习笔记9——构造器注入及其循环依赖

    Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...

  7. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  8. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  9. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...

随机推荐

  1. CentOS 7安装Nginx 1.10.2

    安装epel-release源并进行安装 yum install epel-release yum update(时间会有点长) yum install nginx 相关操作: systemctl s ...

  2. 【题解】SP1811 LCS - Longest Common Substring

    \(\color{purple}{Link}\) \(\text{Solution:}\) 题目要求找到两个串的最长公共子串.\(LCP\) 我们将两个串中间和末尾插入终止符,并弄到一棵后缀树上去. ...

  3. PHP添加新扩展包的步骤

    1.找到PHP解压包,将   php.ini-development   这个文件复制一份,并修改后缀名为  .ini 2.将这个文件打开,将此处注释解开, 3.配置你扩展的该包的位置 4.如果显示不 ...

  4. Appium自动化测试之环境安装

    安装前准备: Python 安装包下载       选择想要想在的python包Node-v6.11.2下载安卓SDK下载appium_forwindows下载 以上四个文件下载下来后,分别解压安装, ...

  5. Rolf Dobelli 《清醒思考的艺术》

    为了避免输光自己靠勤奋积累的财产,罗尔夫·多贝里列了一份系统性思维错误的清单.这一份清单可以和查理·芒格的<人类误判心理学>对照查看. 自本杰明·富兰克林以来,电闪雷鸣没有减少变弱或响声变 ...

  6. vue中,使用 es6的 ` 符号给字符串之间换行

    我这里分功能是点击"复制范围",就相当于复制图上的坐标点一样的数据和格式: "复制功能"的代码如下: copyPoints() { const vm = thi ...

  7. client: c#+protobuf, server: golang+protobuf

    前段时间看到一篇博文<可在广域网部署运行的即时通讯系统 -- GGTalk总览(附源码下载)>,他是用C#实现的即时通讯系统,功能强大,界面漂亮. 就想用golang重写服务端,把代码下载 ...

  8. 这类注解都不知道,还好意思说会Spring Boot ?

    前言 不知道大家在使用Spring Boot开发的日常中有没有用过@Conditionalxxx注解,比如@ConditionalOnMissingBean.相信看过Spring Boot源码的朋友一 ...

  9. 单源文件目录makefile

    目录结构 由于只是用来编译简单的小型程序,所以目录尽量简洁: . ├── build │   ├── bin │   ├── .dep │   └── obj ├── makefile └── src ...

  10. 身为电气人,为什么也要学习C语言编程?人生苦短,我学编程!

    说起编程大家可能都听过,但编程究竟是怎么一回事你弄懂了吗? 编程=对计算机程序进行编写,这些程序可以是现在手里拿着的手机.办公的电脑.你点击的页面.浏览的网页,都是有程序让它执行你要它做的事情. PL ...