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.html、https://www.jianshu.com/p/e989eebc19a5
方式一:切面切Controller层特定包,在环绕通知里面打印入参和出参 作用范围太大了,有的方法也不需要或者浪费了时间
方式二:AOP结合自定义注解,加了注解的方法做切入,打印入参和出参
作者: deity-night
出处: https://www.cnblogs.com/deity-night/
关于作者:码农
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出, 原文链接 如有问题, 可邮件(***@163.com)咨询.