JDK动态代理
代理设计模式的原理:使用一个代理将对象包装起来,然后用该代理对象取代原始对象,任何对原始对象的调用都要通过代理。代理对象决定是否以及何时将方法调用转到原始对象上
例:
package com.zzxtit.spring.aop;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class BankServiceProxy implements InvocationHandler{
private Object target;//目标类
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
for(Object arg: args) {
System.out.println("参数:"+arg);
}
Object returnValue = method.invoke(target, args);//方法的执行,需要对象和参数
System.out.println(returnValue);
return returnValue;
}
public Object createProxy(Object target){//创建代理对象
this.target = target;
return Proxy.newProxyInstance(this.target.getClass().getClassLoader(), this.target.getClass().getInterfaces(), this);
//Proxy.newProxyInstance()的参数分别为 类加载器, 类的所有接口, 和当前对象
}
}
package com.zzxtit.spring.aop;
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BankService bs = new BankServiceImpl();//必须使用接口回调的方式
BankService bsProxy = (BankService) new BankServiceProxy().createProxy(bs);//创建bs的代理对象
bsProxy.transfer("张三", "李四", new BigDecimal("56213"));//在执行bsProxy.transfer()方法时,同时调用invoke()方法
bsProxy.withdraw("lishi", new BigDecimal("132456"));
}
}
关于AOP
1.AOP即面向切面编程,是一种编程模式,一种新的方法论
2.AOP的主要编程对象是切面,而切面模块化横切关注点
3.在应用AOP编程时,仍然需要定义公共功能,但可以明确地定义这个功能在哪里,以什么方式应用,且不必修改受影响的类.
4.AOP的好处:
(1)降低模块耦合度
(2)使系统容易扩展
(3)更好的代码复用性
AOP术语
切面(Aspect):一个横切关注点的模块化,这个关注点可能会横切多个对象,它是横切关注点的另一种表达方式
连接点(Joinpoint): 在程序执行过程中某个特定的点,比如某方法调用的时候或者处理异常的时候
切入点(Pointcut):匹配连接点的断点,它通常是一个表达式,有专门的语法,用于指明在哪里(或者说在那些方法调用上)嵌入横切逻辑
通知(Advice): 再切面的某个特定的连接点上执行的动作,也就是横切逻辑, 如日志处理逻辑,事务处理逻辑
目标对象(Target Object) : 被一个或者多个切面所通知的对象,也被称作被通知对象
代理对象(Proxy Object): AOP框架创建的对象,他和目标对象遵循同样的接口,使用它的方式和使用目标对象的方式是一样的,但是它是目标对象的增强版,“通知”中的代码执行将会被代理对象的方法调用触发。在Spring中,AOP代理可以是JDK动态代理或者CHLIB代理