AOP原理-创建AOP代理--AnnotationAwareAspectJAutoProxyCreator【InstantiationAwareBeanPostProcessor】的作用
生活随笔
收集整理的這篇文章主要介紹了
AOP原理-创建AOP代理--AnnotationAwareAspectJAutoProxyCreator【InstantiationAwareBeanPostProcessor】的作用
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
AnnotationAwareAspectJAutoProxyCreator?
InstantiationAwareBeanPostProcessor
* AnnotationAwareAspectJAutoProxyCreator【InstantiationAwareBeanPostProcessor】的作用: * 1)、每一個bean創建之前,調用postProcessBeforeInstantiation(); * 關心MathCalculator和LogAspect的創建 * 1)、判斷當前bean是否在advisedBeans中(保存了所有需要增強bean) * 2)、判斷當前bean是否是基礎類型的Advice、Pointcut、Advisor、AopInfrastructureBean,或者是否是切面(@Aspect) * * 3)、是否需要跳過 * 1)、獲取候選的增強器(切面里面的通知方法)【List<Advisor> candidateAdvisors】 * 每一個封裝的通知方法的增強器是 InstantiationModelAwarePointcutAdvisor; * 判斷每一個增強器是否是 AspectJPointcutAdvisor 類型的;返回true * 2)、永遠返回false * * 2)、創建對象 * postProcessAfterInitialization; * return wrapIfNecessary(bean, beanName, cacheKey);//包裝如果需要的情況下 * 1)、獲取當前bean的所有增強器(通知方法) Object[] specificInterceptors * 1、找到候選的所有的增強器(找哪些通知方法是需要切入當前bean方法的) * 2、獲取到能在bean使用的增強器。 * 3、給增強器排序 * 2)、保存當前bean在advisedBeans中; * 3)、如果當前bean需要增強,創建當前bean的代理對象; * 1)、獲取所有增強器(通知方法) * 2)、保存到proxyFactory * 3)、創建代理對象:Spring自動決定 * JdkDynamicAopProxy(config);jdk動態代理; * ObjenesisCglibAopProxy(config);cglib的動態代理; * 4)、給容器中返回當前組件使用cglib增強了的代理對象; * 5)、以后容器中獲取到的就是這個組件的代理對象,執行目標方法的時候,代理對象就會執行通知方法的流程; * * * 3)、目標方法執行 ; * 容器中保存了組件的代理對象(cglib增強后的對象),這個對象里面保存了詳細信息(比如增強器,目標對象,xxx); * 1)、CglibAopProxy.intercept();攔截目標方法的執行 * 2)、根據ProxyFactory對象獲取將要執行的目標方法攔截器鏈; * List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass); * 1)、List<Object> interceptorList保存所有攔截器 5 * 一個默認的ExposeInvocationInterceptor 和 4個增強器; * 2)、遍歷所有的增強器,將其轉為Interceptor; * registry.getInterceptors(advisor); * 3)、將增強器轉為List<MethodInterceptor>; * 如果是MethodInterceptor,直接加入到集合中 * 如果不是,使用AdvisorAdapter將增強器轉為MethodInterceptor; * 轉換完成返回MethodInterceptor數組; * * 3)、如果沒有攔截器鏈,直接執行目標方法; * 攔截器鏈(每一個通知方法又被包裝為方法攔截器,利用MethodInterceptor機制) * 4)、如果有攔截器鏈,把需要執行的目標對象,目標方法, * 攔截器鏈等信息傳入創建一個 CglibMethodInvocation 對象, * 并調用 Object retVal = mi.proceed(); * 5)、攔截器鏈的觸發過程; * 1)、如果沒有攔截器執行執行目標方法,或者攔截器的索引和攔截器數組-1大小一樣(指定到了最后一個攔截器)執行目標方法; * 2)、鏈式獲取每一個攔截器,攔截器執行invoke方法,每一個攔截器等待下一個攔截器執行完成返回以后再來執行; * 攔截器鏈的機制,保證通知方法與目標方法的執行順序;總結
以上是生活随笔為你收集整理的AOP原理-创建AOP代理--AnnotationAwareAspectJAutoProxyCreator【InstantiationAwareBeanPostProcessor】的作用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: AOP原理-AnnotationAwar
- 下一篇: N皇后的问题——算法的思想:回溯和剪枝