@EnableAspectJAutoProxy Aop功能开启注解

  为容器中导入 @Import(AspectJAutoProxyRegistrar.class)组件,在其重写方法中为 ioc容器 注册 AnnotationAwareAspectJAutoProxyCreator (Aspectj自动代理生成器)保存beandefinition;

        明名为 "org.springframework.aop.config.internalAutoProxyCreator";(起名)

  AnnotationAwareAspectJAutoProxyCreator initBeanFactory();

    ->AspectJAwareAdvisorAutoProxyCreator

      ->AbstractAdvisorAutoProxyCreator ----》 setBeanFactory();

        ->AbstractAutoProxyCreator   implements SmartInstantiationAwareBeanPostProcessor, BeanFactoryAware(  后置处理器 ,在bean,beanfactory初始化完成后做事情)

        ---->postProcessBeforeInstantiation();

 流程

  1.创建ioc容器,传入主配置类

  2.注册配置类,调用Refresh()方法。

  3.registerBeanPostProcessors(beanFactory);注册bean的后置处理器,来拦截bean的创建。

      a:先获取ioc容器已经定义的需要创建对象的所有BeanPostProcessor(例如@EnableAspectJAutoProxy注解导入的 AnnotationAwareAspectJAutoProxyCreator );

      b:给容器中加入别的BeanPostProcessor

      c:优先注册实现PriorityOrder接口的BeanPostProcessor,下来是实现Order接口的,最后是没实现优先级接口的。

      d:创建bean实例internalAutoProxyCreator ==== AnnotationAwareAspectJAutoProxyCreator

      e:初始化bean包括  invokeAwareMethods()    ---》  applyBeanPostProcessorsBeforeInitialization(应用后置处理器) ---》invokeInitMethods(执行类初始化方法(init))

                            ---》 applyBeanPostProcessorsAfterInitialization

    

                    执行aware方法

  4:完成剩余单实例bean的初始化  getBean -》 doGetBean -》

      a:先从缓存中获取,如果可以获取到,说明之前被创建过。只要创建好的bean 都会被缓存起来

      b:createBean   -》AbstractAutowireCapableBeanFactory.resolveBeforeInstantiation()  // Give BeanPostProcessors a chance to return a proxy instead of the target bean instance.

                希望后置处理器在此能返回一个代理对象

                1. 后置处理器先尝试返回对象

      

        AnnotationAwareAspectJAutoProxyCreator 会在所有bean创建之前尝试创建代理对象

        2.判断当前对象是否在advisedBeans中(保存了是否需要增强的bean)

        Advice.class.isAssignableFrom(beanClass) ||
        Pointcut.class.isAssignableFrom(beanClass) ||
        Advisor.class.isAssignableFrom(beanClass) ||
        AopInfrastructureBean.class.isAssignableFrom(beanClass)  和 shouldSkip(beanClass, beanName)  拿到候选的 增强器  findCandidateAdvisors()

    after:

      3.如果当前bean需要增强,则创建bean的代理对象

      保存增强器到代理工厂,再创建代理对象。

    

        通过jdk(基于接口式的代理)或cglib(通过继承父类)创建代理。下来容器中获取到的就是该对象的代理对象。

      c:doCreateBean  完成真正的创建对象逻辑

  AOP执行机制

  1.以cglib为例 ,执行被代理方法时,代码会进入CglibAopProxy.intercept 方法

  

    2.先获取将要执行方法的拦截器链。

    

    3.创建一个CglibMethodInvocation对象,然后调用proceed方法。返回结果。

Spring Aop 原理分析的更多相关文章

  1. spring aop原理分析

    持续更新... aop跟java代理模式有关. java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 工厂模式用到java反射. ao ...

  2. 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)

    Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...

  3. Spring事务原理分析-部分二

    Spring事务原理分析-部分二 说明:这是我在蚂蚁课堂学习了余老师Spring手写框架的课程的一些笔记,部分代码代码会用到余老师的课件代码.这不是广告,是我听了之后觉得很好. 课堂链接:Spring ...

  4. Spring事务原理分析-部分一

    Spring事务原理分析-部分一 什么事务 事务:逻辑上的一组操作,组成这组操作的各个单元,要么全都成功,要么全都失败. 事务基本特性 ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要 ...

  5. Spring事务原理分析--手写Spring事务

    一.基本概念和原理 1.Spring事务 基于AOP环绕通知和异常通知的 2.Spring事务分为编程式事务.声明事务.编程事务包括注解方式和扫包方式(xml) Spring事务底层使用编程事务(自己 ...

  6. spring ioc 原理 spring aop原理

    大家一直都说spring的IOC如何如何的强大,其实我倒觉得不是IOC如何的强大,说白了IOC其实也非常的简单.我们先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对 ...

  7. Spring Boot -- Spring AOP原理及简单实现

    一.AOP基本概念 什么是AOP,AOP英语全名就是Aspect oriented programming,字面意思就是面向切面编程.面向切面的编程是对面向对象编程的补充,面向对象的编程核心模块是类, ...

  8. 【spring 注解驱动开发】Spring AOP原理

    尚学堂spring 注解驱动开发学习笔记之 - AOP原理 AOP原理: 1.AOP原理-AOP功能实现 2.AOP原理-@EnableAspectJAutoProxy 3.AOP原理-Annotat ...

  9. Spring lazy-init 原理分析

    普通的bean的初始化是在容器启动初始化阶段执行的,而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发.Spring 启动的时候会把所有be ...

随机推荐

  1. 02-03Android学习进度报告三

    今天主要学习了线性布局和相对布局的概念和区别,以及线性布局和相对布局的优缺点. 经过搜素发现,我们屏幕适配的使用用的比较多的就是LinearLayout的权重属性weight,我 学习了一些 Line ...

  2. Uart学习笔记

    分享一个蛮好的链接:https://blog.csdn.net/wordwarwordwar/article/details/73662379 今天在看的资料是S家的DW_apb_uart的官方文档. ...

  3. 使用eclipse创建一个简单的Java Web应用程序

    关于Java JDK/JRE.Tomcat的配置等等都没什么好说的,主要记录一下使用Eclipse创建web工程时的一些点以及说一说自己用IDEA的创建失败的过程(IDEA没运行成功...暂时不想弄了 ...

  4. 2.分析Ajax请求并抓取今日头条街拍美图

    import requests from urllib.parse import urlencode # 引入异常类 from requests.exceptions import RequestEx ...

  5. 无线冲方案 WPC Qi v1.2.4 update

    参考: 1. Qi标准v1.2.4最新版 2. Qi Baseline Power Profile (BPP) and Extended Power Profile (EPP) Wireless Ch ...

  6. Centos7 配置subversion

    CentOS7:配置SVN服务器 Posted on 2016-11-10 15:17 eastson 阅读(4266) 评论(0) 编辑 收藏 1. 安装 CentOS通过yum安装subversi ...

  7. PyCharm底部控制台console界面开启/取消自动换行

    File --> Settings --> Editor --> General --> Console中 勾选右侧第一项Use soft wraps in console(选 ...

  8. 【剑指Offer面试编程题】题目1515:打印1到最大的N位数--九度OJ

    题目描述: 给定一个数字N,打印从1到最大的N位数. 输入: 每个输入文件仅包含一组测试样例. 对于每个测试案例,输入一个数字N(1<=N<=5). 输出: 对应每个测试案例,依次打印从1 ...

  9. java 获取(格式化)日期格式

    // 参考: https://www.cnblogs.com/blog5277/p/6407463.htmlpublic class DateTest { // 支持时分秒 private stati ...

  10. C 语言入门---第六章 C语言数组

    数组就是一些列具有相同类型的数据的集合,这些数据在内存中一次挨着存放,彼此之间没有缝隙. 我们可以将二维数组看作一个Excel表格,有行有列,length1 表示行数,length2 表示列数,要在二 ...