AOP面向切面编程
AOP面向切面编程:
运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术
aop实际上是GoF设计模式的一种延续,也是为了在调用者和被调用者之间解耦和
比如将日志记录,性能统计,安全控制,事务处理,异常处理等代码从业务逻辑代码中划分出来,通过对这些行为的分离,我们希望可以将它们独立到非指导业务逻辑的方法中,进而改变这些行为的时候不影响业务逻辑的代码。
oop:是针对业务处理过程中的实体以及属性行为进行抽象封装
aop:面对业务处理过程中的某个切面进行提取
最常见的一些横切行为如下面这些:
拦截器
日志记录,跟踪,优化和监控
事务的处理
持久化
性能的优化
资源池,如数据库连接池的管理
系统统一的认证、权限管理等
应用系统的异常捕捉及处理
aop利用横切技术,剖解开封装对象的内部,将哪些影响了多个类的公共行为封装到一个可重用的模块,将其命名为Aspect切面,
aop把软件系统分为两个部分:核心关注点,横切关注点。
横切关注点:对那些方面进行拦截,拦截后怎么处理,
切面aspect:类是对物体特征的抽象,而切面是对横切关注点的抽象。
连接点joinpoint:因为spring只支持方法类型的连接点,多以spring中连接点指的是被拦截到的方法,实际上拦截点还可以是字段或者构造器
切入点pointcut:
通知advice:指的就是拦截到拦截点之后要执行的代码,分为前置、后置、异常、最终、环绕通知五类。
目标对象:
织入weave:将切面应运到目标对象并且导致代理对象创建的过程
引入introduction:在不修改代码的前提下,引入可以在运行期为类动态的添加一些方法或者字段。
AOP的原理就是java的动态代理机制(通过反射机制实现的):
两个重要的类或者接口:InvocationHandel(interface) proxy(class)
每一个动态代理类都必须要实现InvocationHandler这个接口,invocationhandler这个接口有一个唯一的方法invoke方法:
Object invoke(Object proxy, Method method, Object[] args) throws Throwable
proxy: 指代我们所代理的那个真实对象
method: 指代的是我们所要调用真实对象的某个方法的Method对象
args: 指代的是调用真实对象某个方法时接受的参数
Proxy这个类的作用就是用来动态创建一个代理对象的类,它提供了许多的方法,但是我们用的最多的就是 newProxyInstance 这个方法:
public static Object newProxyInstance(ClassLoader loader, Class<?>[] interfaces, InvocationHandler h) throws IllegalArgumentException
loader: 一个ClassLoader对象,定义了由哪个ClassLoader对象来对生成的代理对象进行加载
interfaces: 一个Interface对象的数组,表示的是我将要给我需要代理的对象提供一组什么接口,如果我提供了一组接口给它,
那么这个代理对象就宣称实现了该接口(多态),这样我就能调用这组接口中的方法了
h: 一个InvocationHandler对象,表示的是当我这个动态代理对象在调用方法的时候,会关联到哪一个InvocationHandler对象上
https://www.cnblogs.com/xiaoluo501395377/p/3383130.html
JDK动态代理只能对实现了接口的类生成代理,而不能针对类
CGLIB是针对类实现代理,主要是对指定的类生成一个子类,覆盖其中的方法(继承)
拦截器和AOP操作日志:
https://blog.csdn.net/u011521890/article/details/74990338
gogogo