Spring启动过程中实例化前部分的分析
代码部分
说明
1.hasInstantiationAwareBeanPostProcessors()方法说明
其实是判断 AbstractBeanFactory类的hasInstantiationAwareBeanPostProcessors中 是否标志有处理器( 5.3版本后其实是存放于BeanPostProcessorCache中,里面有四个List都是用于存放各种处理器的缓存,不用多做在意,因为5.3之后都是一次性全部遍历存完,优化了部分)
2.applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) 方法说明
该方法作用有两种,一种是修改对象实例元数据(因为还没被创建,所以元数据的改动会导致实例的改动),一种是提前返回Bean对象(可以返回自己定义的某个对象实例)
3.applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName) 方法说明
该方法为初始化后的调用方法,为什么如果bean创建后要调用呢? 因为这个方法与AOP有关,在这个方法中进行AOP,是每个bean都要进行处理的方法,在这个方法内判断需不需要进行动态代理,不需要就返回本身,需要就进行动态代理。(具体可查看 Spring的AOP底层解析 )
代码展示
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
版本区别的记录展示
applyBeanPostProcessorsBeforeInstantiation方法的差异(applyBeanPostProcessorsAfterInitialization方法类似,就写出来了)
说明
1.改进后的版本明显会比之前版本要快,而且会简化一点,因为BeanPostProcessor的全部遍历只会进行一次,而不是每个Bean都会全部遍历一次。(这里面涉及到策略设计模式,本质上取决于,如果bean被创建出来了,后面的处理器其实就不会被调用)
2.以空间换时间的思维更加明显,相比于名称都要拿出全部的BeanPostProcessor进行遍历(而且某些类型还不是需要的),不如按照类型进行划分缓存,虽说消耗了一定量的空间,但是能更快速的按照类型拿出需要的BeanPostProcessor进行遍历处理
代码展示
//5.3之前的版本
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
}
return null;
}
//5.3之后的版本
static class BeanPostProcessorCache {
final List<InstantiationAwareBeanPostProcessor> instantiationAware = new ArrayList<>();
final List<SmartInstantiationAwareBeanPostProcessor> smartInstantiationAware = new ArrayList<>();
final List<DestructionAwareBeanPostProcessor> destructionAware = new ArrayList<>();
final List<MergedBeanDefinitionPostProcessor> mergedDefinition = new ArrayList<>();
}
BeanPostProcessorCache getBeanPostProcessorCache() {
BeanPostProcessorCache bpCache = this.beanPostProcessorCache;
if (bpCache == null) {
bpCache = new BeanPostProcessorCache();
for (BeanPostProcessor bp : this.beanPostProcessors) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
bpCache.instantiationAware.add((InstantiationAwareBeanPostProcessor) bp);
if (bp instanceof SmartInstantiationAwareBeanPostProcessor) {
bpCache.smartInstantiationAware.add((SmartInstantiationAwareBeanPostProcessor) bp);
}
}
if (bp instanceof DestructionAwareBeanPostProcessor) {
bpCache.destructionAware.add((DestructionAwareBeanPostProcessor) bp);
}
if (bp instanceof MergedBeanDefinitionPostProcessor) {
bpCache.mergedDefinition.add((MergedBeanDefinitionPostProcessor) bp);
}
}
this.beanPostProcessorCache = bpCache;
}
return bpCache;
}
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
for (InstantiationAwareBeanPostProcessor bp : getBeanPostProcessorCache().instantiationAware) {
Object result = bp.postProcessBeforeInstantiation(beanClass, beanName);
if (result != null) {
return result;
}
}
return null;
}
applyBeanPostProcessorsAfterInitialization
相关文章
- 深入理解Spring事件机制(二):事件的推送[通俗易懂]
- Spring学习笔记(五)——JdbcTemplate和spring中声明式事务
- Spring MVC框架:第三章:获取请求参数和页面跳转控制
- 简单介绍一下spring bean的生命周期_Spring bean的生命周期
- Spring 全家桶之 Spring Boot 2.6.4(一)- Quickstart
- SqlSessionTemplate详解——Mybatis+Spring Boot整合
- 掌握这些 Spring Boot 启动扩展点,已经超过 90% 的人了!
- Spring Security 自定义资源服务器实践
- Spring MVC注解Controller源码流程解析---请求匹配中的容错处理
- 【08】Spring源码-分析篇-Bean的实例化
- Spring事件监听机制及观察者模式
- 原生AspectJ用法分析以及Spring-AOP原理分析
- 【经验】在Idea中怎么一个spring boot服务怎么模拟多台实例部署
- Spring基础(十三):JDBCTemplate的批操作
- SpringBoot|Spring-Data-Redis 验证码短信存储服务
- 只会用 Spring Boot 创建微服务?这 4 种替代方案了解一下!
- Spring Boot的测试框架(二)
- Spring Cloud Security实现微服务间的安全通信(一)
- Spring Cloud Data Flow 的作用和使用场景
- windows环境下Redis+Spring缓存实例讲解
- Spring Data MongoDB 级联操作详解大数据
- Spring Boot(十三):spring boot小技巧详解编程语言
- Spring Security form login 权限认证模式的实例详解编程语言
- Spring MVC数据绑定和表单标签的应用(附带实例)
- Spring MVC单文件上传(附带实例)
- Spring MVC多文件上传(附带实例)
- Spring query方法:用于JDBC查询
- Maven搭建SSH(Struts2+Spring+Hibernate)框架入门教程(附带实例)
- OAuth2.1授权服务器Spring Authorization Server正式孵化成功进入Spring项目家族
- SSH整合中hibernate托管给Spring得到SessionFactory