https://github.com/singgel?tab=repositories
Spring
AOP的使用,面向切面编程
在程序运营期间,动态的将某段代码切入到指定方法指定位置进行运行的编程方式
1.导入AOP包
2.定义业务逻辑类,进行日志打印
3.定义日志切面类,感知业务逻辑
通知方法:
前置通知@before
后置通知@after
返回通知@afterReturning
异常通知@afterThrowing
环绕通知:@around动态代理(最底层的)
4.给切面类的目标方法标记何时运行
本类引用:方法名
其他的切面引用:全类名
方法名和参数表通过joinPoint对象拿到,必须呀
returning对象来接返回值
exception来接异常信息
5.将切面类和业务逻辑类都加入到容器中
6.必须告诉Spring哪个类是切面类
给切面类加@aspect注解
7给配置文件中加@enableAspectJautoProxy
在Spring中有很多enableXXX:意思是开启某项功能
Spring
AOP的原理:给容器中注册什么组件,组件什么时候工作,工作时候的功能
1.enableAspectJautoProxy注解
导入aopRegistrar自定义容器注册bean
2.给容器注册一个注解代理创建器
bean后置处理器,在bean初始化完成之后做事情
3.abstractAutoProxyCreator有后置处理器,他的子类重写了setBeanFactory方法,这方法又调用了子类的initBeanFactory方法
流程:
1.传入配置类,创建IOC容器
2.注册配置类,调用refresh刷新容器
3.注册bean的后置处理器,拦截bean的创建
获取IOC已经定义的需要创建对象的所有bean后置处理器
给容器中加别的bean后置处理器
优先注册实现了priorityOrdered接口的
再注册实现ordered接口的
最后注册没实现接口的
注册bean后置处理器,实际上就是创建他
创建bean
给bean属性赋值
初始化bean
处理aware接口的方法回调
处理bean初始化接口
调用bean后置处理器的内容
beanPostProcesser创建成功
把beanPostProcessor添加进beanFactory中
4.完成bean初始化工作
遍历获取容器中所有bean依次创建对象
创建bean,先看缓存,没有再创建
创建bean:
给后置处理器一个机会再次创建并返回一个代理对象,如果能就代理,如果不能,就开启创建bean实例流程
Spring
AOP调用过程实际分析
1.每个bean创建之前,调用后置处理器
2.判断bean 是否在adviseBeans中(保存了所有需要增强的bean)
3.判断bean是否为基础类型或是切面类型
4.是否需要跳过:获取后选择的增强器
5.创建对象后置处理器,调用
6.获取所有可用的增强器,如果需要增强创建动态代理对象
7.以后容器中获取到的就是增强的代理对象,如果使用就会执行通知方法流程
Spring
AOP目标方法执行
简单说:
Spring 采用jdk动态代理模式来实现Aop机制。Spring AOP采用动态代理过程: 1.将切面使用动态代理的方式动态织入到目标对象,形成一个代理对象。 2.目标对象如果没有实现代理接口,那么spring会采用CGLib来生成代理对象,该代理对象是目标对象的子类。 3.目标对象如果是final类,也没有实现接口,就不能运用AOP |
1.容器中保存了组件的代理对象,这个对象保存了对象信息、增强器等
2.CGLibAopProxy拦截目标方法的执行:
获取目标方法的拦截器琏
如果有拦截器琏,那需要执行的目标对象、目标方法、拦截器琏传入cgLibMethodInvocation对象中
3.拦截器琏的触发过程,processor的递归调用过程,不停拿下一个拦截器
4.某个拦截器被触发,先执行自己的,再继续往下调,由于拦截器是持续往下调,则执行完就执行上一层拦截器
拦截器保证方法与目标方法的顺序执行
Spring
AOP总结
1.@enableAspectJAutoProxy开启AOP功能
2.@enableAspectJAutoProxy会给容器注册一个annotationAwareAspectJAutoProxyCreator后置对象
4.容器创建流程:
registerBeanPostProcessor注册后置处理器创建annotationAwareAspectJAutoProxyCreator对象
finishBeanFactoryInitialization初始化剩下的bean:创建业务逻辑组件和切面组件、拦截器组件创建流程、创建完之后用包装增强;给业务组件创建代理对象
5.执行目标方法,代理对象要执行目标方法:
cgLib进行拦截
得到目标方法的拦截器链
利用拦截器链收集机制,依次执行
执行效果:正常/异常
正常情况:
异常情况: