3.Java Spring框架源码分析-AOP-AnnotationAwareAspectJAutoProxyCreator是在什么时候起作用的
1. 继续研究BeanPostProcessor的postProcessBeforeInstantiation和postProcessAfterInitialization
我们把断点放行到
- AbstractAutoProxyCreator#postProcessBeforeInitialization
postProcessBeforeInitialization:282, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
applyBeanPostProcessorsBeforeInitialization:407, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1622, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:553, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:481, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:756, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:542, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
main:26, AopConfig
- AbstractAutoProxyCreator#postProcessAfterInitialization
postProcessAfterInitialization:293, AbstractAutoProxyCreator (org.springframework.aop.framework.autoproxy)
applyBeanPostProcessorsAfterInitialization:421, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
initializeBean:1634, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
doCreateBean:553, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
createBean:481, AbstractAutowireCapableBeanFactory (org.springframework.beans.factory.support)
getObject:312, AbstractBeanFactory$1 (org.springframework.beans.factory.support)
getSingleton:230, DefaultSingletonBeanRegistry (org.springframework.beans.factory.support)
doGetBean:308, AbstractBeanFactory (org.springframework.beans.factory.support)
getBean:197, AbstractBeanFactory (org.springframework.beans.factory.support)
preInstantiateSingletons:756, DefaultListableBeanFactory (org.springframework.beans.factory.support)
finishBeanFactoryInitialization:867, AbstractApplicationContext (org.springframework.context.support)
refresh:542, AbstractApplicationContext (org.springframework.context.support)
<init>:84, AnnotationConfigApplicationContext (org.springframework.context.annotation)
main:26, AopConfig
2. 创建其他单实例bean
我们自己写的AopConfig、Calc、LogAspect都会在org.springframework.context.support.AbstractApplicationContext#finishBeanFactoryInitialization这个逻辑中创建,而在创建之前、之后会分别
经过
AbstractAutoProxyCreator#postProcessBeforeInitializationAbstractAutoProxyCreator#postProcessAfterInitialization
这两个AnnotationAwareAspectJAutoProxyCreator的postProcess方法
创建bean的过程参考4.实例化所有非懒加载的单实例bean.md.初始化Bean.执行所有PostProcessor的postProcessBeforeInitialization方法
2.1. 给BeanPostProcess一个机会返回代理对象
- AbstractAutowireCapableBeanFactory#createBean
这个逻辑中可以看出在真正创建bean实例之前,会先给BeanPostProcessors机会返回代理对象,有的话返回,没有的话才是真正创建
protected Object createBean(String beanName, RootBeanDefinition mbd, Object[] args) throws BeanCreationException {
if (logger.isDebugEnabled()) {
logger.debug("Creating instance of bean '" + beanName + "'");
}
RootBeanDefinition mbdToUse = mbd;
// Make sure bean class is actually resolved at this point, and
// clone the bean definition in case of a dynamically resolved Class
// which cannot be stored in the shared merged bean definition.
Class<?> resolvedClass = resolveBeanClass(mbd, beanName);
if (resolvedClass != null && !mbd.hasBeanClass() && mbd.getBeanClassName() != null) {
mbdToUse = new RootBeanDefinition(mbd);
mbdToUse.setBeanClass(resolvedClass);
}
// Prepare method overrides.
try {
mbdToUse.prepareMethodOverrides();
}
catch (BeanDefinitionValidationException ex) {
throw new BeanDefinitionStoreException(mbdToUse.getResourceDescription(),
beanName, "Validation of method overrides failed", ex);
}
try {
// Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.
//给BeanPostProcessors机会返回代理对象,calc会在执行这个逻辑
Object bean = resolveBeforeInstantiation(beanName, mbdToUse);
if (bean != null) {
return bean;
}
}
catch (Throwable ex) {
throw new BeanCreationException(mbdToUse.getResourceDescription(), beanName,
"BeanPostProcessor before instantiation of bean failed", ex);
}
//真正创建bean的逻辑
// 同2.1AnnotationAwareAspectJAutoProxyCreator Bean实例是如何创建的 创建AnnotationAwareAspectJAutoProxyCreator Bean实例
// 即 - doCreateBean
// - createBeanInstance(创建bean实例)
// - populateBean(给bean实例赋值)
// - initializeBean
// - invokeAwareMethods(如果是Aware接口,那么进行一些处理)
// - applyBeanPostProcessorsBeforeInitialization (调用BeanPostProcessor的beforeInitialization方法)
// - invokeInitMethods(执行自定义的初始化方法@PostInit)
// - applyBeanPostProcessorsAfterInitialization(调用BeanPostProcessor的afterInitialization方法)
Object beanInstance = doCreateBean(beanName, mbdToUse, args);
if (logger.isDebugEnabled()) {
logger.debug("Finished creating instance of bean '" + beanName + "'");
}
return beanInstance;
}
- AbstractAutowireCapableBeanFactory#resolveBeforeInstantiation
protected Object resolveBeforeInstantiation(String beanName, RootBeanDefinition mbd) {
Object bean = null;
if (!Boolean.FALSE.equals(mbd.beforeInstantiationResolved)) {
// Make sure bean class is actually resolved at this point.
if (!mbd.isSynthetic() && hasInstantiationAwareBeanPostProcessors()) {
Class<?> targetType = determineTargetType(beanName, mbd);
if (targetType != null) {
//拿到所有的BeanPostProcessor,执行postProcessBeforeInstantiation方法
bean = applyBeanPostProcessorsBeforeInstantiation(targetType, beanName);
if (bean != null) {
//拿到所有的BeanPostProcessor,执行postProcessBeforeInstantiation
bean = applyBeanPostProcessorsAfterInitialization(bean, beanName);
}
}
}
mbd.beforeInstantiationResolved = (bean != null);
}
return bean;
}
2.1.1. 执行postProcessBeforeInstantiation方法
- AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsBeforeInstantiation
protected Object applyBeanPostProcessorsBeforeInstantiation(Class<?> beanClass, String beanName) {
//遍历所有BeanPostProcessor
for (BeanPostProcessor bp : getBeanPostProcessors()) {
if (bp instanceof InstantiationAwareBeanPostProcessor) {
//如果是InstantiationAwareBeanPostProcessor(我们的AspectJAnnotationAutoProxyCreator)
InstantiationAwareBeanPostProcessor ibp = (InstantiationAwareBeanPostProcessor) bp;
//执行postProcessBeforeInstantiation方法
Object result = ibp.postProcessBeforeInstantiation(beanClass, beanName);
//不为空才返回
if (result != null) {
return result;
}
}
}
return null;
}
2.1.2. 执行postProcessAfterInitialization方法
- AbstractAutowireCapableBeanFactory#applyBeanPostProcessorsAfterInitialization
public Object applyBeanPostProcessorsAfterInitialization(Object existingBean, String beanName)
throws BeansException {
Object result = existingBean;
//遍历所有BeanPostProcessor
for (BeanPostProcessor processor : getBeanPostProcessors()) {
//执行postProcessAfterInitialization方法
result = processor.postProcessAfterInitialization(result, beanName);
if (result == null) {
return result;
}
}
return result;
}
3.Java Spring框架源码分析-AOP-AnnotationAwareAspectJAutoProxyCreator是在什么时候起作用的的更多相关文章
- 设计模式(五)——原型模式(加Spring框架源码分析)
原型模式 1 克隆羊问题 现在有一只羊 tom,姓名为: tom, 年龄为:1,颜色为:白色,请编写程序创建和 tom 羊 属性完全相同的 10 只羊. 2 传统方式解决克隆羊问题 1) 思路分析(图 ...
- 干货分享之spring框架源码分析02-(对象创建or生命周期)
记录并分享一下本人学习spring源码的过程,有什么问题或者补充会持续更新.欢迎大家指正! 环境: spring5.X + idea 之前分析了Spring读取xml文件的所有信息封装成beanDef ...
- Java集合框架源码分析(2)LinkedList
链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...
- Spring IOC 源码分析
Spring 最重要的概念是 IOC 和 AOP,本篇文章其实就是要带领大家来分析下 Spring 的 IOC 容器.既然大家平时都要用到 Spring,怎么可以不好好了解 Spring 呢?阅读本文 ...
- 精尽Spring Boot源码分析 - 剖析 @SpringBootApplication 注解
该系列文章是笔者在学习 Spring Boot 过程中总结下来的,里面涉及到相关源码,可能对读者不太友好,请结合我的源码注释 Spring Boot 源码分析 GitHub 地址 进行阅读 Sprin ...
- Spring Ioc源码分析系列--Ioc的基础知识准备
Spring Ioc源码分析系列--Ioc的基础知识准备 本系列文章代码基于Spring Framework 5.2.x Ioc的概念 在Spring里,Ioc的定义为The IoC Containe ...
- Spring AMQP 源码分析 07 - MessageListenerAdapter
### 准备 ## 目标 了解 Spring AMQP 如何用 POJO 处理消息 ## 前置知识 <Spring AMQP 源码分析 04 - MessageListener> ## 相 ...
- Spring AMQP 源码分析 06 - 手动消息确认
### 准备 ## 目标 了解 Spring AMQP 如何手动确认消息已成功消费 ## 前置知识 <Spring AMQP 源码分析 04 - MessageListener> ## 相 ...
- Spring AMQP 源码分析 05 - 异常处理
### 准备 ## 目标 了解 Spring AMQP Message Listener 如何处理异常 ## 前置知识 <Spring AMQP 源码分析 04 - MessageListene ...
- Spring Security 源码分析 --- WebSecurity
概述 spring security 源码分析系列文章. 源码分析 我们想一下,我们使用 ss 框架的步骤是怎么样的. @Configuration @EnableWebSecurity @Enabl ...
随机推荐
- 【Linux】5.5 Shell运算符
Shell运算符 Shell 和其他编程语言一样,支持多种运算符,包括: 算数运算符 关系运算符 布尔运算符 字符串运算符 文件测试运算符 原生bash不支持简单的数学运算,但是可以通过其他命令来实现 ...
- EntityFramework GroupJoin
总而言之, GroupJoin 是先 Join 后 Group, 对应的 SQL 也是先 Join, 然后通过内置 LINQ 操作分组. 参考文档 GroupJoin 方法 Reimplementin ...
- C++数据的共享和保护
1.函数原型作用域:C++中最小的作用域 ①在函数原型声明时,形参的作用范围就是函数原型作用域. 2.局部作用域/块作用域 3.类作用域 类可以被看做是一组有名成员的集合,类X的成员m具有类作用域,对 ...
- sql查询语句典例整理
简单查询: 1.SELECT * FROM 表名称 WHERE 字段名 LIKE '查询内容' 1). SELECT * FROM member WHERE NickName LIKE '贝克汉姆': ...
- 2025dsfz集训Day7: KMP与Trie树
Day7: KMP与Trie树 \[Designed\ By\ FrankWkd\ -\ Luogu@Lwj54joy,uid=845400 \] 特别感谢 此次课的主讲 - Kwling KMP算法 ...
- mysql重新设置密码、远程登录及中文乱码修改
基础环境 版本:mysql 5.7.33 系统:ubuntun0.18.04 一.忘记密码问题 1.编辑配置文件/etc/mysql/mysql.conf.d/mysqld.cnf,注意此为ubunt ...
- 项目开发管理最佳实践之一 --定义异常类exceptions
项目开发中,经常遇到需要抛出异常情况,可以根据项目存在情况定一个异常类,项目以django ,rest_framework为例 1 rom django.db.models.deletion impo ...
- JavaScript编程实践:打造优雅健壮的代码
@charset "UTF-8"; .markdown-body { line-height: 1.75; font-weight: 400; font-size: 15px; o ...
- Intel指令集及SIMD数据加速
查看CPU相关信息 执行结果举例: 查看电脑CPU支持的指令集: cat /proc/cpuinfo | grep "processor" | wc -l 支持的指令集: 向量指令 ...
- VsCode+DeepSeek的AI编程助手初体验
前言 最近随着AI编程助手的兴起,我这个重度码农也想试着尝下鲜,看看他究竟有多厉害,会不会把我们都给取代了.Github Copilot大名鼎鼎,和微软全家桶重度绑定,但是使用价格不菲,并且使用它有一 ...