Spring AOP使用总结

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进行拦截
  得到目标方法的拦截器链
  利用拦截器链收集机制,依次执行
  执行效果:正常/异常 

正常情况: 
one-ok


异常情况: 
one-exception

猜你喜欢

转载自blog.csdn.net/singgel/article/details/79861003