AOP的基础概念详解
- AOP:面向切面编程
- OOP:面向对象编程
- AOP的作用:可以针对目标对象进行无感知(在不修改代码的情况下)功能增强
- 功能分为业务功能和系统功能
- 业务功能:业务操作
- 系统功能:事物、日志、安全等
- 功能分为业务功能和系统功能
- AOP可以将业务功能和系统功能进行拆分、专人干专事
- AOP是一种思路,它的实现产品有多种:AspectJ、spring AOP、spring和AspectJ整合
- AOP是通过哪种实现无感知的功能增强?
- 静态织入
- 使用字节码拼接技术,在编译期间,针对目标对象对应的class文件进行静态编码(asm)
- 动态织入
- 使用动态代理技术,在运行期间,针对目标对象进行动态代理
- 静态织入
AOP核心概念分析
- 连接点
- 切入点
- 目标对象
- 代理对象
- 通知
- 切面/通知器
- 引介
AOP核心概念图式
代理技术
- 静态代理
- 在编译期间,为目标类,编写一个代理类,缺点是会编写很多的代理类
- 动态代理
- 在运行期间,为目标类,利用动态代理技术产生代理对象
动态代理模式
- JDK动态代理
- 代理对象和目标类对象是实现了同一个接口的
- 使用这种代理技术的前提是:目标对象必须实现某一个业务接口
- CGLib动态代理
- 代理对象是目标对象的子类,它是通过对目标对象实现继承的方式,进行功能增强
- 使用这种代理技术的前提是:不需要目标对象必须实现某一个业务接口
- JDK动态代理是Spring默认使用的
JDK动态代理(有接口的目标对象)
- 产生代理对象流程(Proxy.newProxyInstance(classloader,interfaces,InvoationHandler))
- 通过反射可以获取接口的信息,然后由java来编写代理实现类的源代码(.java文件)
- java来对它自己写的源代码进行编译(API),产生class文件
- 产生的class文件,需要通过classloader加载加载到jvm内存中
- 在jvm中产生代理对象
- 产生代理对象的底层原理
- 由JDK编写代理类的原文件(.java)-------interfacers,InvocationHandler
- 由JDK编译成class文件
- 使用传入的classloader加载class文件
- 代理对象调用流程:InvocationHandler.invoke(proxy,method,args)方法
- 根据通知位置编写增强代码
- 调用目标对象的方法
-
InvocationHandler.invoke(proxy,method,args){ before(); //调用目标对象的目标方法 after(); }
CGLIB动态代理模式(没有接口和非final目标对象)---ASM(生成和修改字节码的工具包)
- 如何产生代理对象
-
Enhancer enhancer=new Enhancer(); enhancer.setSuerClass(目标对象的class对象); enhancer.setCallback(MethodInterceptor的实现类); Object proxy=enhancer.create();
-
- 产生代理对象的底层原理
- 使用ASM工具包去针对目标类的class文件,进行修改,产生新的class文件
-
如何执行代理对象
-
MethodInterceptor的实现类.intercept(proxy,targetMethod,args,proxyMethod){ //before(); 调用目标对象的目标方法 //Method.invoke(target,args); methodProxy.invokeSuper(proxy,args); //after(); }
-
-
由InvocationHandler和MethodInterceptor产生的思考
-
如果invoke方法和intercept方法是我们程序员写好的,那怎么保证功能的扩展性呢?
-
通过配置去确定加哪些通知(前置、后置、最终)
-
通过一定的逻辑(执行链条--MethodInvocation和MethodInterceptor去完成)去控制多个通知的执行顺序
-
多个前置通知的顺序如何保证?
- 一个前置通知和一个后置通知的执行顺序如何保证?
-