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. STM32之旅3——时钟数

    STM32之旅3--时钟数 STM32F1是M3内核,它的时钟数很庞大,让一个初学者去看,估计会很吃力,和我们入门的8051单片机的时钟不同,这里又倍频.又分频,而且还分成好多个时钟,不同的外设时钟不 ...

  2. Croppie -一个Javascript图像Croppie

    下载 Croppie -一个Javascript图像CroppieCroppie -一个Javascript图像Croppie 安装 凉棚:凉棚安装作物 Npm: Npm安装作物 下载: croppi ...

  3. vue+element ui 关闭弹窗前清空form表单的值

    this.$refs['disposeConfigsform'].resetFields();

  4. 【手摸手,带你搭建前后端分离商城系统】01 搭建基本代码框架、生成一个基本API

    [手摸手,带你搭建前后端分离商城系统]01 搭建基本代码框架.生成一个基本API 通过本教程的学习,将带你从零搭建一个商城系统. 当然,这个商城涵盖了很多流行的知识点和技术核心 我可以学习到什么? S ...

  5. vector专题

    <C++程序设计语言(第4部分:标准库)> 31.4 容器 31.4.1 vector 31.4.1.1 vector和增长 重要知识点:vector的内存布局 vector不会在添加每个 ...

  6. hdfs的JAVA必会操作

    hdfs的必会操作 创建目录 //创建目录 public static void mkdir(String filePath) throws URISyntaxException, IOExcepti ...

  7. day08 Pyhton学习

    一.昨日内容回顾 .1.基础部分的补充 join()  把列表变成字符串, 拼接 split() 切割 删除: 列表和字典不能在循环的时候进行删除. 把要删除的内容记录在一个新列表中,然后循环新列表, ...

  8. 【Luogu】P3005 [USACO10DEC]槽的游戏The Trough Game

    一.题目 题目描述 农夫约翰和贝西又在玩游戏.这个游戏需要很多个槽. 农夫约翰在谷仓里藏起来了N(1<=N<=20)个槽,并且他已经把其中的一些装上了食物.贝西以"在这个表里(表 ...

  9. swoole热启动

    通过扫描指定的要扫描的目录,把所有文件找出来,分别md5 连接字符串,最后再md5返回 启动定时器,扫描,当前的加密值和以前一样不管,否则就重启服务,把当前赋值给旧值 . httpServer.php ...

  10. git tag的应用

    一,git的tag是什么? tag就是给commit起一个容易记忆容易理解的名字 说明:架构森林是一个专注架构的博客,地址:https://www.cnblogs.com/architectfores ...