SpringBoot#aop

Posted luohaonan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringBoot#aop相关的知识,希望对你有一定的参考价值。

AOP原理解析,一切始于@EnableAspectJAutoProxy。【所有原理分析,看给容器添加了什么组件,组件的功能】
1、@EnableAspectJAutoProxy是什么?
    @Import(AspectJAutoProxyRegister.clss)给容器中导入AspectJAutoProxyRegister
        利用AspectJAutoProxyRegister给容器中添加一些Bean:
        internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator
    给容器中注册一个叫AnnotationAwareAspectJAutoProxyCreator。

2、AnnotationAwareAspectJAutoProxyCreator功能分析:
AnnotationAwareAspectJAutoProxyCreator
    ->AspectJAwareAdvisorAutoProxyCreator
        ->AbstractAdvisorAutoProxyCreator
            ->AbstractAutoProxyCreator
                implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware
            在弄明白继承关系后,需要关注后置处理器(bean初始化前后完成的事情)、自动装配BeanFactory

3、给主要相关逻辑加上断点
AbstractAutoProxyCreator.setBeanFactory() //被子类重写
AbstractAutoProxyCreator.postProcessBeforeInstantiation()

AbstractAdvisorAutoProxyCreator.setBeanFactory() ->> initBeanFactory() //被子类重写

AnnotationAwareAspectJAutoProxyCreator.initBeanFactory()


4、调用流程(30p)
    1)传入配置类,创建ioc容器
    2)注册配置类,调用refresh()刷新容器
    3)registerBeanPostProcessors(beanFactory)//注册用来拦截bean创建的后置处理器:
        1)在ioc容器中按BeanPostProcessor.class类型获取已经定义要创建的所有后置处理器的名称
        2)给容器中加入别的BeanPostProcesser
        3)优先注册实现了PriorityOrdered接口的BeanPostProcessor;
        4)再给容器中注册实现了Ordered接口的BeanPostProcesser;
        5)注册没有实现优先级接口BeanPostProcessor
        6)注册BeanPostProcessor实际上就是创建BeanPostProcessor对象,保存在容器中。
            创建internalAutoProxyCreator=AnnotationAwareAspectJAutoProxyCreator
                1)创建bean实例
                2)populateBean,给bean的各种属性赋值
                3)initializeBean,初始化bean
                    1)invokeAwareMethods():处理Aware接口的方法回调
                    2)applyBeanPostProcessorsBeforeInitialization()应用后置处理器的postProcessBeforeInitialization方法
                    3)invokeInitMethods()执行自定义的初始化方法
                    4)applyBeanPostProcessorsAfterInitialization()执行后置处理器的postProcessAfterInitialization方法;
                4)一个BeanPostProcessor的实现就注册成功了(AnnotationAwareAspectJAutoProxyCreator)
        7)把BeanPostProcessor注册到BeanFactory中:
            beanFactory.addBeanPostProcessor(postProcessor);
=========以上是创建和注册AnnotationAwareAspectJAutoProxyCreator的过程========================
        AnnotationAwareAspectJAutoProxyCreator => InstantiationAwareBeanPostProcessor
    4)finishBeanFactoryInitialization(beanFactory);完成BeanFactory初始化工作,创建剩下的单实例bean
        1)遍历获取容器中所有的Bean依次创建对象getBean(beanName);
            getBean->> doGetBean()->>getSingleton()->>
        2)创建Bean
            【AnnotationAwareAspectJAutoProxyCreator在所有bean创建之前会有一个拦截,会调用postProcessBeforeInstantiation】
            1)先从缓存中获取当前bean,如果能获取到,说明bean是之前创建的,直接使用,否则再创建,
               只要创建好的Bean都会被缓存起来
            2)createBean();创建bean,AnnotationAwareAspectJAutoProxyCreator会在任何bean创建前先尝试返回bean实例。
                【BeanPostProcessor是在Bean创建完成初始化前后调用的】
                【InstantiationAwareBeanPostProcessor是在创建Bean实例前先尝试使用后置处理器返回对象】
                1)resolveBeforeInstantiation(beanName,mbdToUse);解析BeforeInstantiation
                    希望后置处理器在此能返回一个代理对象,如果能返回就使用,否则就继续
                        1)后置处理器先尝试返回对象:
                            bean=applyBeanPostProcessorsBeforeInstantiation();
                                拿到后置处理器,如果是InstantiationAwareBeanPostProcessor就执行postProcessBeforeInstantiation
                            if(bean != null){
                                bean = applyBeanPostProcessorsAfterInitialization(bean,beanName)
                            }
                2)doCreateBean(beanName,mbdToUse,args);真正的去创建一个bean实例,和3.6的流程是一样的。
                3)

以上是关于SpringBoot#aop的主要内容,如果未能解决你的问题,请参考以下文章

SpringBoot入门到精通-SpringBoot自定义starter

SpringBoot.06.SpringBoot日志管理

SpringBoot.06.SpringBoot日志管理

最全面的SpringBoot教程——SpringBoot概述

SpringBoot入门到精通-SpringBoot集成SSM开发项目

如何把springboot插件删除干净