一, AOP 简介
AOP:Aspect Oriented Programming, 面向切面编程, 通过预编译方式和动态代理实现程序功能的统一维护的一种技术. 利用 AOP 对业务逻辑各个部分进行抽取隔离, 从而使逻辑各部分间的耦合度降低, 提高程序的可重用性, 提高开发效率.
JDK 动态代理和 Cglib 动态代理
JDK 动态代理 (基于接口)
- Target target = new Target(); // 创建目标对象
- // 创建代理对象, Target implements TargetInterface
- TargetInterface proxy = (TargetInterface) Proxy.newProxyInstance(target.getClass().getClassLoader(),
- target.getClass().getInterfaces(),new InvocationHandler() {
- @Override
- public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
- System.out.println("前置增强代码...");
- Object invoke = method.invoke(target, args);// 反射方法对象, 即要执行的目标对象
- System.out.println("后置增强代码...");
- return invoke;
- }
- });
Cglib 动态代理 (基于父类)
- Target target = new Target(); // 创建目标对象
- Enhancer enhancer = new Enhancer(); // 创建增强器
- enhancer.setSuperclass(Target.class); // 设置父类
- enhancer.setCallback(new MethodInterceptor() { // 设置回调
- @Override
- public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
- System.out.println("前置代码增强....");
- Object invoke = method.invoke(target, objects);
- System.out.println("后置代码增强....");
- return invoke;
- }
- });
- Target proxy = (Target) enhancer.create(); // 创建代理对象
AOP 相关术语
Target(目标对象) | 代理的目标对象 |
Proxy (代理) | 一个类被 AOP 织入增强后,就产生一个结果代理类 |
Joinpoint(连接点) | 那些可以被拦截到的点。在 spring 中, 这些点指的是方法,因为 spring 只支持方法类型的连接点 |
Pointcut(切入点) | 对哪些 Joinpoint 进行拦截的定义 |
Advice(通知 / 增强) | 拦截到 Joinpoint 之后所要做的事情就是通知 |
Aspect(切面) | 是切入点和通知(引介)的结合 |
Weaving(织入) | 把增强应用到目标对象来创建新的代理对象的过程。spring 采用动态代理织入,而 AspectJ 采用编译期织入和类装载期织入 |
二, 基于 xml 的 AOP 开发
来源: http://www.bubuko.com/infodetail-3120057.html