一丶前言

笔记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的前置准备的更多相关文章

  1. Spring源码学习笔记之基于ClassPathXmlApplicationContext进行bean标签解析

    bean 标签在spring的配置文件中, 是非常重要的一个标签, 即便现在boot项目比较流行, 但是还是有必要理解bean标签的解析流程,有助于我们进行 基于注解配置, 也知道各个标签的作用,以及 ...

  2. Spring源码学习-容器BeanFactory(四) BeanDefinition的创建-自定义标签的解析.md

    写在前面 上文Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签对Spring默认标签的解析做了详解,在xml元素的解析中,Spri ...

  3. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  4. Spring 源码学习笔记11——Spring事务

    Spring 源码学习笔记11--Spring事务 Spring事务是基于Spring Aop的扩展 AOP的知识参见<Spring 源码学习笔记10--Spring AOP> 图片参考了 ...

  5. Spring源码学习笔记12——总结篇,IOC,Bean的生命周期,三大扩展点

    Spring源码学习笔记12--总结篇,IOC,Bean的生命周期,三大扩展点 参考了Spring 官网文档 https://docs.spring.io/spring-framework/docs/ ...

  6. Spring源码学习-容器BeanFactory(三) BeanDefinition的创建-解析Spring的默认标签

    写在前面 上文Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作中Spring对XML解析后创建了对应的Docum ...

  7. Spring源码学习-容器BeanFactory(二) BeanDefinition的创建-解析前BeanDefinition的前置操作

    写在前面 上文 Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件主要讲Spring容器创建时通过XmlBeanDefinitionReader读 ...

  8. Spring源码学习笔记9——构造器注入及其循环依赖

    Spring源码学习笔记9--构造器注入及其循环依赖 一丶前言 前面我们分析了spring基于字段的和基于set方法注入的原理,但是没有分析第二常用的注入方式(构造器注入)(第一常用字段注入),并且在 ...

  9. Spring源码学习-容器BeanFactory(一) BeanDefinition的创建-解析资源文件

    写在前面 从大四实习至今已一年有余,作为一个程序员,一直没有用心去记录自己工作中遇到的问题,甚是惭愧,打算从今日起开始养成写博客的习惯.作为一名java开发人员,Spring是永远绕不过的话题,它的设 ...

  10. spring源码学习笔记之容器的基本实现(一)

    前言 最近学习了<<Spring源码深度解析>>受益匪浅,本博客是对学习内容的一个总结.分享,方便日后自己复习或与一同学习的小伙伴一起探讨之用. 建议与源码配合使用,效果更嘉, ...

随机推荐

  1. Django-rest-framework框架——过滤排序分页异常处理、自动生成接口文档、JWT认证

    @ 目录 一 过滤Filtering 二 排序 三 分页Pagination 可选分页器 应用 四 异常处理 Exceptions 4.1 使用方式 4.2 案例 4.3 REST framework ...

  2. 安装vscode

    1.下载vscode安装包 因为vscode官网下载太慢, 所以从360的软件库下载: https://baoku.360.cn/soft/search?kw=vscode 2.直接点击安装 3.设置 ...

  3. 什么???CSS也能原子化!

    1.什么是原子化 CSS? Atomic CSS is the approach to CSS architecture that favors small, single-purpose class ...

  4. [WPF]原生TabControl控件实现拖拽排序功能

    在UI交互中,拖拽操作是一种非常简单友好的交互.尤其是在ListBox,TabControl,ListView这类列表控件中更为常见.通常要实现拖拽排序功能的做法是自定义控件.本文将分享一种在原生控件 ...

  5. Unity - UIWidgets 2. 控件组合

    UIWidgets没有提供完整文档, 称可以去看Flutter的文档 中文 \ 英文 控件(Control)在Flutter中称为"Widget", 一个界面的若干控件是通过wid ...

  6. 2022-10-22 CSP赛前隔离时的模拟赛 2:3

    T1 简单红题,不懈于写. 锐评:镜子反射出来的竟然没有镜像一下. T2 坑人东西调了 2h. 类似于 round1 的 T4. 线性 \(\Theta(n)\) 过. T3 T4 其实简单,负边权要 ...

  7. 牛逼!Github上最有价值的一个开源项目!

    哈喽,我是老鱼,一名致力于在技术道路上的终身学习者.实践者.分享者! 今天介绍的这个项目,我愿称之为Github最有价值的开源项目! 一个小而全而美的第三方登录开源组件,相信你一定能用的上~ Just ...

  8. KMeans算法全面解析与应用案例

    本文深入探讨了KMeans聚类算法的核心原理.实际应用.优缺点以及在文本聚类中的特殊用途,为您在聚类分析和自然语言处理方面提供有价值的见解和指导. 关注TechLead,分享AI全维度知识.作者拥有1 ...

  9. CON2 工单重估 效率提升

    CON2 工单重估 效率提升 业务背景:月结CON2 每次只能允许一个进程操作 集团公司较多的话,很影响月结效率. SAP提供了专家模式程序 RKAZCON2 ,可以选平行运行   平行处理 需要选服 ...

  10. MYSQL EXPLAIN 执行计划

    EXPLAIN 执行计划 有了慢查询语句后,就要对语句进行分析.一条查询语句在经过 MySQL 查询优化器的各种基于成本和规则的优化会后生成一个所谓的执行计划,这个执行计划展示了接下来具体执行查询的方 ...