开头先大致说一下bean的生命周期
创建 Bean 实例 → 填充属性 → 初始化前:
→ 所有 postProcessBeforeInitialization(bean, name)
执行 init 方法(比如 @PostConstruct)
→ 所有 postProcessAfterInitialization(bean, name)
OK,进入正题,首先要明白AOP到底是怎么起作用的,不是那个@Aspect注解(这个注解的作用仅仅是标识作为一个切面类),AOP是靠@EnableAspectJAutoProxy注解起作用
首先,我们怎么知道哪些类需要被AOP代理呢?
AOP的核心类就是这个AnnotationAwareAspectJAutoProxyCreator,它实现了BeanPostProcessor
Spring 在创建每个 Bean 时,会自动调用所有 BeanPostProcessor 的方法,上面这个类AnnotationAwareAspectJAutoProxyCreator实现了这个方法,所以bean初始化后也会调用这个方法。
整体也就是,当我们创建一个bean的时候会在后置处理器判断这个方法是不是需要代理,如果需要代理就会生成代理对象。
其次代理之后是怎么进行增强的?
当你在一个切面上定义多个通知(@Before
、@After
、@Around
等),Spring 会把它们转化成一个个 Advice
,再封装成拦截器 MethodInterceptor
,统一放入一个「拦截器链」中。方法调用时,这条链会一层层套娃式地执行它们。