Spring Aop 原理分析
@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 原理分析的更多相关文章
- spring aop原理分析
持续更新... aop跟java代理模式有关. java.lang.reflect.Proxy java.lang.reflect.InvocationHandler 工厂模式用到java反射. ao ...
- 面试问烂的 Spring AOP 原理、SpringMVC 过程(求求你别问了)
Spring AOP ,SpringMVC ,这两个应该是国内面试必问题,网上有很多答案,其实背背就可以.但今天笔者带大家一起深入浅出源码,看看他的原理.以期让印象更加深刻,面试的时候游刃有余. Sp ...
- Spring事务原理分析-部分二
Spring事务原理分析-部分二 说明:这是我在蚂蚁课堂学习了余老师Spring手写框架的课程的一些笔记,部分代码代码会用到余老师的课件代码.这不是广告,是我听了之后觉得很好. 课堂链接:Spring ...
- Spring事务原理分析-部分一
Spring事务原理分析-部分一 什么事务 事务:逻辑上的一组操作,组成这组操作的各个单元,要么全都成功,要么全都失败. 事务基本特性 ⑴ 原子性(Atomicity) 原子性是指事务包含的所有操作要 ...
- Spring事务原理分析--手写Spring事务
一.基本概念和原理 1.Spring事务 基于AOP环绕通知和异常通知的 2.Spring事务分为编程式事务.声明事务.编程事务包括注解方式和扫包方式(xml) Spring事务底层使用编程事务(自己 ...
- spring ioc 原理 spring aop原理
大家一直都说spring的IOC如何如何的强大,其实我倒觉得不是IOC如何的强大,说白了IOC其实也非常的简单.我们先从IOC说起,这个概念其实是从我们平常new一个对象的对立面来说的,我们平常使用对 ...
- Spring Boot -- Spring AOP原理及简单实现
一.AOP基本概念 什么是AOP,AOP英语全名就是Aspect oriented programming,字面意思就是面向切面编程.面向切面的编程是对面向对象编程的补充,面向对象的编程核心模块是类, ...
- 【spring 注解驱动开发】Spring AOP原理
尚学堂spring 注解驱动开发学习笔记之 - AOP原理 AOP原理: 1.AOP原理-AOP功能实现 2.AOP原理-@EnableAspectJAutoProxy 3.AOP原理-Annotat ...
- Spring lazy-init 原理分析
普通的bean的初始化是在容器启动初始化阶段执行的,而被lazy-init修饰的bean 则是在从容器里第一次进行context.getBean(“”)时进行触发.Spring 启动的时候会把所有be ...
随机推荐
- Django问题 Did you rename .....a ForeignKey
给新加入的字段添加一个default默认值即可,让字段非空.然后在进行makemigrations,完成操作后删除相关默认值即可.
- Curl常用函数介绍
一.LibCurl基本编程框架 在基于LibCurl的程序里,主要采用callback function (回调函数)的形式完成传输任务,用户在启动传输前设置好各类参数和回调函数,当满足条件时libc ...
- Ubuntu18.04下Qt5.9.8连接mysql数据库失败的解决办法
问题: 连接mysql数据库时,出现如下 提示: QSqlDatabase: QMYSQL driver not loaded QSqlDatabase: available drivers: QSQ ...
- MyEclipse和Eclipse中常用的快捷键
##########################快捷键分类速查########################## *******常用类********[Ctrl+O] 显示类中方法和 ...
- Flask - 总结
1. Flask.Django.Tornado框架区别 2. Flask快速入门 3. 配置文件 4. 路由系统 5. 模板 6. 请求&响应相关 7. session & cooki ...
- mysql 获取刚插入行id汇总
mysql 获取刚插入行id汇总 我们在写数据库程序的时候,经常会需要获取某个表中的最大序号数, 一般情况下获取刚插入的数据的id,使用select max(id) from table 是可以的.但 ...
- Java单例模式:为什么我强烈推荐你用枚举来实现单例模式
单例模式简介 单例模式是 Java 中最简单,也是最基础,最常用的设计模式之一.在运行期间,保证某个类只创建一个实例,保证一个类仅有一个实例,并提供一个访问它的全局访问点.下面就来讲讲Java中的N种 ...
- 吴裕雄 Bootstrap 前端框架开发——Bootstrap 表单:表单帮助文本
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...
- mathematica练习程序(第一章 Mathematica的基本量)
虽然过去有用Mathematica解过一些问题,不过对这个语言并没有系统学习过. 所以最近想重新把Mathematica系统的学一遍. 偶然在B站上找到了这样一组教程:https://www.bili ...
- 微信二次分享的JSSDK的调用
网页端微信的二次分享如果不调用分享的SDK,分享之后就不会带有标题.描述 .缩略图 微信分享SDK调用 引入 <script src="//res.wx.qq.com/open/js/ ...