Spring--IOC容器的一些扩展属性

发布于:2025-06-25 ⋅ 阅读:(23) ⋅ 点赞:(0)

一、BeanFactoryPostProcessor和BeanPostProcessor

BeanFactoryPostProcessor的作用是在实例化前修改BeanDefinition的属性

BeanPostProcessor的作用是在bean完成创建实例、填充属性之后,初始化阶段的前后都会对bean进行操作,使用postProcessBeforeInitialization和postProcessAfterInitialization。

BeanFactoryPostProcessor控制BeanDefinition流程:

  1. 自定义类实现BeanFactoryPostProcessor接口,实现postProcessBeanFactory方法
  2. 执行postProcessBeanFactory方法修改BeanDefinition

BeanPostProcessor知道初始化前后操作方法:

  1. 自定义类实现BeanPostProcessor,实现postProcessBeforeInitialization和postProcessAfterInitialization方法
  2. 将自定义BeanPostProcessor添加到beanFactory中(手动添加)
  3. 在初始化方法中,会先后(相对于初始化)遍历beanFactory的BeanPostProcessor,并调用before/after方法。

BeanFactoryPostProcessor逻辑
加载并读取文件 ----> 注册BeanDefinition ----> 自定义BeanFactoryPostProcessor并执行postProcessBeanFactory

BeanPostProcessor逻辑:
加载BeanDefinition ----> 自定义BeanPostProcessor并加入到beanFactory中 ----> 初始化方法中Spring扫描BeanPostProcessor集合,调用before/after方法

二、初始化和销毁

Bean的创建流程:

  1. 创建实例
  2. 填充属性
  3. 初始化
  4. 注册销毁方法(注册销毁方法的适配器,包含销毁方法,bean名称等)

初始化:
先判断Bean是否实现InitializingBean,如果实现则执行初始化方法。然后再遍历BeanDefinition中的初始化方法并通过反射执行。

销毁方法:
先判断Bean是否实现DisposableBean,再从存放销毁方法的集合中获取bean的销毁适配器,执行销毁方法。

三、Aware接口

Aware接口的作用是:

允许实现了接口的实例bean可以获取bean所在的beanfactory/applicationcontext等,进而使用其他服务(bean中需要增加beanfactory/applicationcontext属性)

BeanFactoryAware,在初始化前操作前,实例化后,判断bean是否实现接口,如果实现,则注入bean的beanfactory属性

BeanApplicationContextAware,在初始化前操作中注入属性。

四、Bean的作用域

Bean的作用域:

  1. 创建实例

  2. 填充属性

    (设置aware)

  3. 初始化前 初始化 初始化后

  4. 注册销毁方法

  5. 将bean注册到容器中

Bean的作用域:

  1. 单例singleton:如果是单例,则有4、5
  2. 如果是prototype(每次使用则则销毁):则没有4、5

也就是说:原型bean没有销毁方法,不会存入容器

五、FactoryBean

在获取bean的时候,如果该bean实现了FactoryBean接口,则调用getObject方法(可以将复杂的类转为自定义管理在容器中)

(sington直接获取并存入FactoryBean缓存中,下次从缓存中获取,prototype每次都调用getObject方法获取bean)

六、容器事件和事件监听

事件监听和容器事件:

  1. 在AbstractApplicationContext中先将事件监听器添加到事件发布者multicaster中

  2. 然后发布refresh容器刷新事件,(事件发布者发布事件,发布之后,遍历事件发布者中的监听器泛型是否是发布事件的类型,如果是就调用监听器中的方法)在这里插入图片描述

  3. 最后在AbstractApplicationContext中的doclose方法中发布关闭事件


网站公告

今日签到

点亮在社区的每一天
去签到