Spring源码学习笔记3——根据BeanDefinition实例化Bean的前置准备
一丶前言
笔记1和笔记2中我们分析了如何根据xml和注解加载生成BeanDefinition,并注册到BeanFactory,接下载便是Bean的加载,在加载之前会进行一些前置准备

二丶前置准备 和BeanPostProcessor
1.什么是BeanPostProcesser
翻译过来是Bean后置处理器,是Spring留给我们的一个扩展接口,定义了两个方法,会被Spring回调,
调用的时机和大致流程如下图

BeanPostProcesser接口包含如下两个方法
public interface BeanPostProcessor {
//初始化执行之前
Object postProcessBeforeInitialization(Object bean, String beanName) throws BeansException;
//初始化执行之后
Object postProcessAfterInitialization(Object bean, String beanName) throws BeansException;
}
通过BeanPostProcessor我们可以实现自定义对Spring管理的bean进行再加工。比如:可以修改bean的属性,可以给bean生成一个动态代理实例等等。Spring AOP的底层处理也是通过实现BeanPostProcessor来执行代理包装逻辑的。
2.前置准备中的BeanPostProcessor

这里可以看到前置准备给BeanFactory加入了ApplicationContextAwareProcessor和ApplicationListenerDetector,我们详细看下具体操作逻辑
2.1 ApplicationContextAwareProcessor
ApplicationContextAwareProcessor没有在postProcessAfterInitialization中写任何逻辑,但是在postProcessBeforeInitialization 中回执行ApplicationContextAwareProcessor的invokeAwareInterfaces 方法

其实就是如果我们的Bean继承了EnvironmentAware,EmbeddedValueResolverAware,ResourceLoaderAware,ApplicationEventPublisherAware,MessageSourceAware,ApplicationContextAware ,回去调用对应的方法
2.1.1 Aware 接口是什么
Aware接口没有提供任何方法需要实现,只是做一个标记,表示当前这个类,可以被Spring容器执行回调方法,怎么回调呢——ApplicationContextAwareProcessor 就是一个例子
2.2 ApplicationListenerDetector

ApplicationListenerDetector 监听器探测器,非常有意思,使用了一个Map维护Bean的名称和Bean是否单例

2.2.1 维护 singletonNamesMap


2.2.2 销毁Bean之后从多播器中移除

Spring提供的监听器机制,其实是使用一个Set维护了所以的监听器Bean,当Bean销毁后,也就没有必要去在Set维护Bean了,类似于公众号的取关
三.web应用的 postProcessBeanFactory

1.ServletContextAwareProcessor
没什么好看的r,实现了ServletContextAware 和 ServletConfigAware 的接口会通过这个BeanPostProcessor回调setServletContextAware 或者 setServletConfigAware
2.request,session,globalSession 等作用域注册
//注册request,session,globalSession 作用域
WebApplicationContextUtils.registerWebApplicationScopes(beanFactory, this.servletContext);

这些作用域到底是如何实现的,后续看BeanFactory实例化Bean的时候再研究一下
3.注入Web环境的Bean
WebApplicationContextUtils.registerEnvironmentBeans(beanFactory, this.servletContext, this.servletConfig);
主要逻辑是servletContext和 servletConfig的初始化参数 封装成Map注入到BeanFactory
Spring源码学习笔记3——根据BeanDefinition实例化Bean的前置准备的更多相关文章
- Spring源码学习笔记之基于ClassPathXmlApplicationContext进行bean标签解析
bean 标签在spring的配置文件中, 是非常重要的一个标签, 即便现在boot项目比较流行, 但是还是有必要理解bean标签的解析流程,有助于我们进行 基于注解配置, 也知道各个标签的作用,以及 ...
- Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md
写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...
- Spring 源码学习笔记10——Spring AOP
Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...
- Spring 源码学习笔记11——Spring事务
Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...
- Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点
Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...
- Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签
写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...
- Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作
写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读 ...
- Spring源码学习笔记9——构造器注入及其循环依赖
Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...
- Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件
写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设 ...
- spring源码学习笔记之容器的基本实现(一)
前言 最近学习了<<Spring源码深度解析>>受益匪浅,本博客是对学习内容的一个总结.分享,方便日后自己复习或与一同学习的小伙伴一起探讨之用. 建议与源码配合使用,效果更嘉, ...
随机推荐
- Makefile 入门教程
Makefile 是一个非常强大的构建自动化工具,用于管理项目的编译.链接和其他构建任务.以下是一个详细的 Makefile 使用文档,包括基本概念.语法.示例和常见任务. 1. 基本概念 目标 (T ...
- DP 复习
背包 约定使用 \(v_i\) 表示放入第 \(i\) 件物品的花费,\(w_i\) 表示第 \(i\) 件物品的价值,背包容量 \(M\),物品件数 \(N\). 01 背包 每种物品仅有一件,可以 ...
- P4899 [IOI2018] werewolf 狼人 题解
P4899 [IOI2018] werewolf 狼人 题解 题目描述 省流: \(n\) 个点,\(m\) 条边,\(q\) 次询问,对于每一次询问,给定一个起点 \(S\) 和终点 \(T\) , ...
- [ABC216G] 01Sequence 题解
01Sequence 题目大意 构造一个满足 \(m\) 个形如 \((l,r,x)\) 的限制条件的 \(01\) 序列,其中 \((l,r,x)\) 表示区间 \([l,r]\) 的和不小于 \( ...
- [C++]线段树 区间修改 单点查询
线段树 区间修改 单点查询 请先阅读上一篇Bolg 算法思想 由于是区间修改 那就把下放的每一个线段给套上一层标记 来表达增加的值 单点查询就把那些标记穿起来就行了 当然 还要加上那原来的值 来举个例 ...
- 教你使用逻辑公式和恒等式等价改写SQL
今天同事给我一条2秒的SQL看看能不能优化. 原始SQL: SELECT pk_dept FROM aaaa WHERE 1 = 1 AND ((pk_group = '0001A1100000000 ...
- 深度解析NLP文本摘要技术:定义、应用与PyTorch实战
在本文中,我们深入探讨了自然语言处理中的文本摘要技术,从其定义.发展历程,到其主要任务和各种类型的技术方法.文章详细解析了抽取式.生成式摘要,并为每种方法提供了PyTorch实现代码.最后,文章总结了 ...
- mobaxterm软件的使用
MobaXterm是一款功能强大的多功能远程计算机管理软件,可以在Windows操作系统下运行,支持SSH.Telnet.RDP.VNC等协议 一.软件下载与安装 下载地址:https://mobax ...
- Android RTL 语言适配
RTL 语言,即 right to left language,也就是右对齐的语言,与一般语言按照左对齐的方式不同,需要进行特别适配. AndroidManifest.xml 文件中,增加 andro ...
- JavaScript Date转字符串格式
JavaScript Date转字符串格式