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 ...
随机推荐
- Windows程序设计学习笔记(1):一个简单的windows程序
<Windows程序设计>(第五版)(美Charles Petzold著) #include<windows.h> LRESULT CALLBACK WndProc(HWND, ...
- Mongodb - 解决 ( aggregate聚合管道 ) $match 根据 id 匹配 返回 [ ] 的问题
需要对 id 进行转换 const mongoose = require('mongoose') var ObjectId = mongoose.Types.ObjectId; await Use ...
- 「luogu3810」陌上花开
「luogu3810」陌上花开 传送门 三维偏序, \(\text{CDQ}\) 分治板子题. 判重的地方注意一下,别的就都是板子了. 参考代码: #include <algorithm> ...
- 图片切换.----so屌
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- python 基础之列表的操作和列表的相关函数
一.列表的相关操作 1.列表的拼接 list1 = [1,2]list2 = [3,4]listvar = list1 + list2print(listvar) 2.列表的重复 lst = [1,2 ...
- CSS - 布局流程
一.为了提高网页制作的效率,布局时通常需要遵守一定的布局流程,具体如下: "版心"(可视区) 是指网页中主体内容所在的区域.一般在浏览器窗口中水平居中显示,常见的宽度值为960px ...
- [Linux] day06——文档管理
文档管理===================mkdir 创建目录 -p /路径/目录名 (父路径不存在 -p) --------------------------------------- t ...
- vs2015中安装cplex攻略以及解决丢失cplex.dll问题
转:http://blog.sina.com.cn/s/blog_61f0374801014swp.html 按:相信配置过CPLEX的人大多有过痛苦而难忘的经历,本人亦不例外,纠结挣扎了一个下午加一 ...
- 使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件
使用input:file控件在微信内置浏览器上传文件返回未显示选择的文件 原来的写法: <input type="file" accept="image/x-png ...
- Day9 - I - 不要62 HDU - 2089
杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer).杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍, ...