目录
动态代理
动态代理是一种常用的设计模式,广泛应用于框架中,Spring框架的AOP特性就是应用动态代理实现的,想要理解AOP的实现原理我们就必须先理解动态代理。
什么是代理模式
代理模式是GOF23设计模式之一,代理模式中存在代理者和被代理者,代理者和被代理者都具有相同的功能,并且代理者执行功能时会附加一些额外的操作
如:手机工厂和代理商都具有卖东西的功能,手机代理商除了帮工厂卖手机外,还能在卖手机前打广告推销,卖手机后还可以进行售后服务
代理模式的优点:
- 符合开闭原则,不用修改被代理者任何的代码,就能扩展新的功能
- 项目的扩展和维护比较方便
代理模式分为:静态代理和动态代理
静态代理
什么是静态代理
- 代理者和被代理者都实现了相同的接口(或继承相同的父类)
- 代理者包含了一个被代理者的对象
- 调用功能时,代理者会调用被代理者的功能,同时附加新的操作
动态代理
动态代理的特点:
- 在不修改原有类的基础上,为原来类添加新的功能
- 不需要依赖某个具体业务
动态代理分为:JDK动态代理和CGLib动态代理
区别是:
JDK动态代理的被代理者必须实现任意接口
CGLib动态代理不用实现接口,是通过继承实现的
JDK动态代理
实现步骤:
- 代理类需要实现InvocationHandler接口
- 实现invoke方法
- 通过Proxy类的newProxyInstance方法来创建代理对象
实例代码:
public static void main(String[] args) {
//明确要代理的对象
Actor cxk=new CXK();
/**
* 创建代理对象,具体某个人作为经纪人,对代理对象的方法进行服务(功能增强)
* 参数1,ClassLoader loader 被代理的类的类加载器(底层使用的反射)
* 2,Class<?>[] interfaces 被代理的类的接口类型(类型的判断)
* 3,InvocationHandler h 被代理后要做什么事情
*/
Actor jjr= (Actor) Proxy.newProxyInstance(CXK.class.getClassLoader(), CXK.class.getInterfaces(), new InvocationHandler() {
/**
* Object proxy:被代理对象的一个引用
* Method method:被代理对象的方法
* Object[] args:方法被执行时需要的参数列表
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//前置增强
System.out.println("进行巡演造势");
//方法的三要素
Object result=null;
String methodName= method.getName();
System.out.println(methodName);
//方法执行需要一个对象的引用
result=method.invoke(cxk,args);
//后置增强
System.out.println("结算和纳税");
return result;
}
});
//3,执行方法,由代理对象进行执行
jjr.sing(5,3.14);
jjr.rap();
}
}