一.Spring IOC容器

1.1Spring IOC 你只需要告诉它你需要哪个bean,他就会把具体的实例发给你,至于这个实例是否依赖其他bean,如何完成初始化,你根本不需要关心

IoC容器想要管理各个业务对象以及它们之间的依赖关系,需要通过某种途径来记录和管理这些信息。BeanDefinition对象就承担了这个责任:容器中的每一个bean都会有一个对应的BeanDefinition实例,该实例负责保存bean对象的所有必要信息,包括bean对象的class类型、是否是抽象类、构造方法和参数、其它属性等等。当客户端向容器请求相应对象时,容器就会通过这些信息为客户端返回一个完整可用的bean实例。

BeanDefinitionRegistryBeanFactory很关键,BeanDefinitionRegistry抽象出bean的注册逻辑,而BeanFactory则抽象出了bean的管理逻辑,而各个BeanFactory的实现类就具体承担了bean的注册以及管理工作。

①、容器启动阶段

容器启动时,会通过某种途径加载 ConfigurationMetaData。除了代码方式比较直接外,在大部分情况下,容器需要依赖某些工具类,比如:BeanDefinitionReader,BeanDefinitionReader会对加载的 ConfigurationMetaData进行解析和分析,并将分析后的信息组装为相应的BeanDefinition,最后把这些保存了bean定义的BeanDefinition,注册到相应的BeanDefinitionRegistry,这样容器的启动工作就完成了。这个阶段主要完成一些准备性工作,更侧重于bean对象管理信息的收集,当然一些验证性或者辅助性的工作也在这一阶段完成。

BeanFactory只是Spring IoC容器的一种实现,如果没有特殊指定,它采用采用延迟初始化策略:只有当访问容器中的某个对象时,才对该对象进行初始化和依赖注入操作。而在实际场景下,我们更多的使用另外一种类型的容器:ApplicationContext,它构建在BeanFactory之上,属于更高级的容器,除了具有BeanFactory的所有能力之外,还提供对事件监听机制以及国际化的支持等。它管理的bean,在容器启动时全部完成初始化和依赖注入操作。

注:经常有人会问,BeanFactory和ApplicationContext有什么区别?

你可以回答,ApplicationContexxt属于更高级的容器,比BeanFacory多出来对事件的监听和国际化,最主要的是,他是在容器启动的时候就完成了全部的初始化和依赖注入的操作。而BeanFactory采用的是延迟初始化策略。

1.2、Spring容器扩展机制

IoC容器负责管理容器中所有bean的生命周期,而在bean生命周期的不同阶段,Spring提供了不同的扩展点来改变bean的命运。在容器的启动阶段, BeanFactoryPostProcessor允许我们在容器实例化相应对象之前,对注册到容器的BeanDefinition所保存的信息做一些额外的操作,比如修改bean定义的某些属性或者增加其他信息等。

如果要定义自定义扩展类,需要实现BeanFactoryPostProcessor,由于可能有多个BeanFactoryPostProcessor,可能还需要Ordered接口,来保证BeanFactoryPostProcessor顺序执行。

以PropertyPlaceholderConfigurer为例:

在Spring项目的XML配置文件中,经常可以看到许多配置项的值使用占位符,而将占位符所代表的值单独配置到独立的properties文件,这样可以将散落在不同XML文件中的配置集中管理,而且也方便运维根据不同的环境进行配置不同的值。这个非常实用的功能就是由PropertyPlaceholderConfigurer负责实现的。

根据前文,当BeanFactory在第一阶段加载完所有配置信息时,BeanFactory中保存的对象的属性还是以占位符方式存在的,比如 ${jdbc.mysql.url}。当PropertyPlaceholderConfigurer作为BeanFactoryPostProcessor被应用时,它会使用properties配置文件中的值来替换相应的BeanDefinition中占位符所表示的属性值。当需要实例化bean时,bean定义中的属性值就已经被替换成我们配置的值。当然其实现比上面描述的要复杂一些,这里仅说明其大致工作原理,更详细的实现可以参考其源码。

与之相似的,还有 BeanPostProcessor,其存在于对象实例化阶段。跟BeanFactoryPostProcessor类似,它会处理容器内所有符合条件并且已经实例化后的对象。简单的对比,BeanFactoryPostProcessor处理bean的定义,而BeanPostProcessor则处理bean完成实例化后的对象。BeanPostProcessor定义了两个接口:

postProcessBeforeInitialization 前置处理

prostProcessAfterInitialization 后置处理,

postProcessBeforeInitialization()方法与 postProcessAfterInitialization()分别对应图中前置处理和后置处理两个步骤将执行的方法。这两个方法中都传入了bean对象实例的引用,为扩展容器的对象实例化过程提供了很大便利,在这儿几乎可以对传入的实例执行任何操作。注解、AOP等功能的实现均大量使用了 BeanPostProcessor,比如有一个自定义注解,你完全可以实现BeanPostProcessor的接口,在其中判断bean对象的脑袋上是否有该注解,如果有,你可以对这个bean实例执行任何操作,想想是不是非常的简单?

再来看一个更常见的例子,在Spring中经常能够看到各种各样的Aware接口,其作用就是在对象实例化完成以后将Aware接口定义中规定的依赖注入到当前实例中。比如最常见的 ApplicationContextAware接口,实现了这个接口的类都可以获取到一个ApplicationContext对象。当容器中每个对象的实例化过程走到BeanPostProcessor前置处理这一步时,容器会检测到之前注册到容器的ApplicationContextAwareProcessor,然后就会调用其postProcessBeforeInitialization()方法,检查并设置Aware相关依赖。

SpringBoot知识清单相关推荐

  1. 给你一份长长长的 Spring Boot 知识清单(上)

    预警:本文非常长,建议先mark后看,也许是最后一次写这么长的文章 说明:前面有4个小节关于Spring的基础知识,分别是:IOC容器.JavaConfig.事件监听.SpringFactoriesL ...

  2. 超详细 Spring Boot 知识清单

    2019独角兽企业重金招聘Python工程师标准>>> 超详细 Spring Boot 知识清单 在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许 ...

  3. Spring Boot知识清单

    2019独角兽企业重金招聘Python工程师标准>>> Spring Boot知识清单 Spring Boot 应用本质上就是一个基于 Spring 框架的应用,它是 Spring ...

  4. 给你一份超详细 Spring Boot 知识清单

    转载自   给你一份超详细 Spring Boot 知识清单 在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spri ...

  5. 重磅 | 19 页花书精髓笔记!你可能正需要这份知识清单

    点击上方"AI有道",选择"星标"公众号 重磅干货,第一时间送达 <深度学习>,又名"花书".该书由三位大佬 Ian Goodf ...

  6. 11月22日云栖精选夜读 | 送你一份Spring Boot 知识清单

    在过去两三年的Spring生态圈,最让人兴奋的莫过于Spring Boot框架.或许从命名上就能看出这个框架的设计初衷:快速的启动Spring应用.因而Spring Boot应用本质上就是一个基于Sp ...

  7. javascrpt知识要点梳理——知识清单

    写在前面: 这篇文章是我在学习<javascript高级程序设计(第三版)>时随书所做的笔记,由于使用word记录的笔记,转到markdown编辑器里有点吃力,所以文章排版可能会有点问题. ...

  8. 972知识点 | 经过时间和实战检验的972知识清单

    文章目录 前言 第一章 信息检索概述 第二章 信息检索的方法与技术 第三章 搜索引擎 第四章 国内重要的综合性信息检索系统 第五章 国外重要的综合性信息检索系统 第六章 专业性书目信息检索系统 第七章 ...

  9. 企业质量管理的25个知识清单

    什么是质量管理?华天谋精益质量管理专家概述:质量管理体系(Quality Management System,QMS)是指在质量方面指挥和控制组织的管理体系.质量管理体系是组织内部建立的.为实现质量目 ...

最新文章

  1. 51js 的json编辑器
  2. [CTSC2017]吉夫特
  3. 获取进程号并赋值判断进程状态
  4. windows系统采用了那种访问控制模型_Linux-3.2 系统与硬件(下)(连载)
  5. Windows 7 自动更新失败导致无法进系统解决方案
  6. Windows 7 HomeGroup的隐私保护
  7. MySQL笔记-binlog理论及binlog回滚恢复数据
  8. mysql申请 表空间_MySQL 系统表空间扩容方法
  9. spring学习--JdbcTemplate-查询返回-批量操作
  10. 64. 雇员管理系统
  11. IDEA 常用设置 与 常用操作(三)
  12. 基于IC设计的实用ISP介绍
  13. 解决mikumikudance丢失dxdx_43.dll问题
  14. 网易互娱笔试题(2021春招)
  15. python3爬妹子图_python3爬妹子图
  16. HTTP常见请求头/响应头
  17. 论文笔记-精读-8.24-Pruning neural networks without any data by iteratively conserving synaptic flow
  18. 2022年春招 360笔试 第二题 翻转棋子
  19. 现有的画笔和创建自己的画笔6zhongGDI
  20. 【b站黑马程序员C++视频学习笔记-多态案例三-电脑组装】

热门文章

  1. 股票量化分析工具QTYX使用攻略——形态选股叠加业绩报告
  2. 源码|并发一枝花之BlockingQueue
  3. 大数据介绍及集群安装
  4. 网站部署详细流程(包括域名,服务器的配置等)
  5. 纯前端实现上传下载(后端存取json)xlsx
  6. 刘未鹏博客 http://mindhacks.cn/
  7. 2020年大厂面试题-数据仓库篇
  8. 重装系统无法在计算机上运行,升级 Windows10 RS1 之后系统频繁提示 “此应用无法在此电脑上运行”...
  9. 解决android程序调用摄像头黑屏
  10. 仿win7 aero_如何禁用Windows 7的Aero性能警告?