refresh():重要,里面有13个方法

spring配置文件的加载过程

用一个能够读取各种格式文件的解析器去读 文件,并把文件里的解析成bean的定义信息

image.png
比如这里是xml文件。 里面的内容想转成bean定义信息要经过:加载、解析。
容器就是用来存放bean的。那么容器用什么数据结构比较好?用map。 使用map存储
image.png
spring框架为了保证自己的扩展性(主要为其生态化考虑),开放了可以操作bean的接口。
比如下图的beanFactoryPostProcessor()。 经过后置处理器之后,就可以用Class.newInstance()进行实例化了
image.png

bean的创建过程(生命周期)

image.pngimage.png
bean的声明周期:整体分成实例化和初始化。 初始化又包含填充属性和执行init-method等方法。即如下

  • 实例化
  • 初始化
    • 填充属性
    • 执行方法
      • 实现aware接口的类里的方法
      • 实现beanPostProcessor接口的类实现的方法
      • init-method
  • 完成对象
  • 销毁流程

监听器和多播器

image.png

PostProcessor:后置处理器/增强器

顾名思义。有点类似代理方法这种。 就是在方法正式执行之前给方法做个增强,或者对传入目标方法的参数做些手脚。 比较扎眼的有这两个:beanFactoryPostProcessor和beanPostProcessor

beanFactoryPostProcessor

image.png
作用:对生成beanFactory做些操作。(对生成bean工厂进行进行一些增强)

beanPostProcessor:在bean填充完属性之后,对bean进行一些操作,比如添加动态代理

image.png
这个方法在bean组件填充属性代码之后(通过set方法填充的属性,而不是构造方法填充)。

可以进行什么操作呢?比如添加动态代理。
首先知道aop的实现原理是通过动态代理给bean生成代理类。而且动态代理有两种方式:jdk和cglib动态代理
接下来看看这个:找到BeanPostProcessor的一个实现类 ->AbstractAutoProxyCreator,看他实现的postProcessBeforeInitialization() -> createProxy() -> getProxy() -> 顺利找到 jdk和cglib
image.pngimage.pngimage.png

aware接口

aware接口的功能:就是为了让我自己的组件可以调用spring容器里的底层组件。

几个问题

image.pngimage.pngimage.png