spring在bean初始化完成后、放入单例池前,由annotationawareaspectjautoproxycreator的postprocessafterinitialization方法调用wrapifnecessary生成aop代理;代理基于已完全初始化的原始bean,依据切面匹配结果选择jdk或cglib方式创建,并最终替换原始bean注入ioc容器。

Spring 生成 AOP 代理对象,是在 Bean 初始化完成之后、正式放入单例池(singletonObjects)之前,由特定的 BeanPostProcessor 完成的。核心时机和机制非常明确,不是在实例化或属性注入阶段,而是在初始化方法(如 afterPropertiesSet 或 init-method)执行完毕后。
代理对象生成发生在 postProcessAfterInitialization 阶段
Spring 容器在完成一个 Bean 的完整初始化流程(包括 Aware 接口回调、属性填充、初始化方法调用)后,会调用所有注册的 BeanPostProcessor 的 postProcessAfterInitialization 方法。AOP 的代理逻辑就嵌入在这里:
-
触发类:具体由
AnnotationAwareAspectJAutoProxyCreator(继承自AbstractAutoProxyCreator)实现; -
关键方法:其
postProcessAfterInitialization内部会调用wrapIfNecessary判断是否需要代理; -
判断依据:检查当前 Bean 是否匹配任意已解析的切面(
Advisor),即是否满足切入点表达式(@Pointcut)且有对应通知(@Before/@Around等)。
代理创建前已完成全部 Bean 初始化
代理对象必须基于一个“可用的原始 Bean”来构建,因此 Spring 严格保证:
Miller (mlr) 是一个命令行工具,用于查询、整形和重新格式化名称索引数据,如 CSV、TSV、JSON 和 JSON Lines。它将 awk、sed、cut、join 和 sort 的功能整合到一个专为结构化数据处理而构建的单一工具中。
- 目标 Bean 已完成实例化、依赖注入、Aware 回调、初始化方法执行;
- 字段值、setter 注入、
@PostConstruct、InitializingBean等均已生效; - 此时的 Bean 是功能完备的,代理对象才能安全地持有它并拦截方法调用。
动态代理策略由 AbstractAutoProxyCreator 自动选择
是否生成代理、用哪种方式代理,取决于目标类特征和配置:
- JDK 动态代理:目标类至少实现一个接口时默认启用,生成的是接口代理;
-
CGLIB 代理:目标类没有实现接口,或显式设置
proxy-target-class=true时启用,生成子类代理; -
不代理的情况:Bean 是
AopInfrastructureBean类型(如切面本身)、是被@Aspect标注的类、或被@EnableAspectJAutoProxy(exposeProxy = false)显式排除等。
代理对象最终替换原始 Bean 进入 IOC 容器
整个过程对开发者透明:
-
wrapIfNecessary返回代理对象后,applyBeanPostProcessorsAfterInitialization将其作为最终结果返回; - 该代理对象取代原始 Bean,被注册进单例缓存(
singletonObjects); - 后续所有
getBean调用拿到的都是代理对象,从而实现方法拦截与增强逻辑织入。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










