当前位置: 首页 > news >正文

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

一、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方法中发布关闭事件

相关文章:

  • C++之二叉搜索树及其实现
  • 【开源工具】一键解决使用代理后无法访问浏览器网页问题 - 基于PyQt5的智能代理开关工具开发全攻略
  • 17、Rocket MQ快速实战以及核⼼概念详解
  • Vscode自定义代码快捷方式
  • MySQL-日志+事务
  • 海拔案例分享-门店业绩管理小程序
  • uniapp+vue3做小程序,获取容器高度
  • 短期项目与长期目标如何同时兼顾
  • 华为云 Flexus+DeepSeek 征文|增值税发票智能提取小工具:基于大模型的自动化信息解析实践
  • 【面板数据】上市公司投资者保护指数(2010-2023年)
  • 【达梦数据库】忘记SYSDBA密码处理方法-已适配
  • 第十六届蓝桥杯C/C++程序设计研究生组国赛 国二
  • JavaScript中的10种排序算法:从入门到精通
  • 【源码+文档+调试讲解】基于web的运动健康小程序的设计与实现y196
  • VMware安装Ubuntu22.04详细教程
  • 基于协议转换的 PROFIBUS DP 与 ETHERNET/IP 在石化生产中的协同运行实践
  • Docker镜像制作
  • 从Java API调用者到架构思考:我的Elasticsearch认知升级之路
  • 【Linux篇章】线程同步与互斥2:打破多线程并发困境,开启高效程序运行新境界
  • libwebsockets编译
  • 网站建设创建/bt兔子磁力天堂
  • 英语网站新增两个栏目/石家庄最新消息
  • 做网站便宜的公司/大连最好的做网站的公司
  • 中国经济排名世界第几/网络推广优化工具
  • 哪个网站可以做效果图/百度推广一天烧多少钱
  • 做品牌特价的网站有哪些/体育热点新闻