AOP

什么是AOP

1.aop就是面向切面的编程
    通过预编译的方式和运行期动态代理的实现,实现程序功能的统一维护的一种技术
2.利用aop可以对业务的逻辑的各个部分进行隔离
    从而使得业务逻辑各部分之间的(耦合度降低)
    提高程序代码的可以重用性,同时也提高了开发的效率
3.精髓——横向重复,纵向抽取 (横着看有重复的,纵着把每个里面重复的都抽取出来)
 
AOP(Aspect Orient Programming),作为面向对象编程的一种补充,广泛应用于处理一些具有横切性质的系统级服务,如事务管理安全检查缓存对象池管理等。AOP实现的关键就在于AOP框架自动创建的AOP代理,AOP代理则可分为静态代理和动态代理两大类,其中静态代理是指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成AOP代理类,因此也称为编译时增强;而动态代理则在运行时借助于JDK动态代理、CGLIB等在内存中“临时”生成AOP动态代理类,因此也被称为运行时增强。
 
AOP就是面向切面编程,可以从以下几个方面来实现AOP
 
  • 在编译期修改源代码;
  • 在运行期字节码加载前修改字节码;
  • 在运行期字节码加载后动态的创建代理类的字节码

能做的事情

  • 性能监控,在方法调用前后记录调用时间,方法执行太长或超时报警。
  • 缓存代理,缓存某方法的返回值,下次执行该方法时,直接从缓存里获取。
  • 软件破解,使用AOP修改软件的验证类的判断逻辑。
  • 记录日志,在方法执行前后记录系统日志。
  • 工作流系统,工作流系统需要将业务代码和流程引擎代码混合在一起执行,那么我们可以使用AOP将其分离,并动态挂接业务。
  • 权限验证,方法执行前验证是否有权限执行当前方法,没有则抛出没有权限执行异常,由业务代码捕捉。

相关术语

1.连接点 (joinponit)
  spring允许你使用通知的地方,基本每个方法的前,后(两者都有也行),或抛出异常时都可以是连接点
  spring只支持方法连接点.其他如aspectJ还可以让你在构造器或属性注入时都行,不过那不是咱关注的,只要记住,和方法有关的前前后后(抛出异常),都是连接点。
2. 切入点(pointcout)
  已经增强的方法,叫做切入点
  上面说的连接点的基础上,来定义切入点,你的一个类里,有15个方法,那就有几十个连接点了对把,但是你并不想在所有方法附近都            使用通知(使用叫织入,以后再说),你只想让其中的几个,在调用这几个方法之前,之后或者抛出异常时干点什么,那么就用切点来定义这几个方法,让切点来筛选连接点,选中那几个你想要的方法。将业务逻辑方法与切面连接起来
3.通知(advice)
——>增加的代码
2.通知分为以下通知
  |-前置通知
    目标方法运行前进行调用
  |-返回通知
    目标方法运行后进行调用的
  |-异常通知
    目标方法出现异常就会运行的通知
  |-最终通知
    1.无论是否出现异常,那么都会进行执行
    2.目标方法之后进行运行的方法
  |-环绕通知
    目标方法运行前后进行调用的通知
4.目标对象 (Target)
  真正编写业务逻辑的对象 (如真实主题实现类)
5.织入(weaving)
  将通知应用到切入点的过程 (将增强代码应用到被增强的方法上)
6。代理(proxy)
  将通知织入到目标对象之后,而形成的代理对象
7.切面(Aspect)
  切入点和通知的结合。通知说明了干什么和什么时候干(什么时候通过方法名中的before,after,around等就能知道),而切入点说明了在哪干(指定到底是哪个方法),这就是一个完整的切面定义。
 
概括为一句话:用切面携带通知在切入点附近的连接点处切入,这一过程叫织入,由代理实现

 

XML配置版

 

 

AOP实现日志打印入参、出参

参考:https://www.cnblogs.com/zwjvzwj/p/16612094.htmlhttps://www.jianshu.com/p/e989eebc19a5

 

方式一:切面切Controller层特定包,在环绕通知里面打印入参和出参  作用范围太大了,有的方法也不需要或者浪费了时间

方式二:AOP结合自定义注解,加了注解的方法做切入,打印入参和出参

 

 

 

 

 

 

posted on 2023-03-04 11:10  or追梦者  阅读(10)  评论(0编辑  收藏  举报