代理模式是SpringAop的底层实现机制
静态代理
角色:
- 抽象角色: 一般由接口或抽象类实现
- 真实角色:被代理的角色
- 代理角色: 代理真实角色后,一般会增加一些附加操作
- 客户:访问代理角色的人
静态代理的优点 :
- 真实角色可以专注于自己的业务
- 公共业务交给代理角色,实现业务的分工
- 代理角色可以扩展业务,并集中管理
- 可以在不修改原有代码的基础上,添加一些日志的功能
静态代理的缺点 :
每生成一个真实对象,就要生成一个代理对象,代码量会翻倍,开发效率会降低
动态模式
1.基于接口实现
Api:InvocationHandler,Proxy
角色:
- 抽象角色: 一般由接口或抽象类实现
- 真实角色:被代理的角色
- 代理角色: 代理真实角色后,一般会增加一些附加操作
- 客户:访问代理角色的人
优点:
在静态代理的基础上,解决静态代理的缺点:动态生成代理类
/**
* 实现InvocationHandler(在反射包下) 1.基于接口实现
* 通过这个类,自动生成代理类
*/
public class DynamicProxyBulider implements InvocationHandler {
Object target;
public void setTarget(Object target) {
this.target = target;
}
/**
* 动态生成代理类
* @return
*/
public Object getProxy(){
/**
* 通过反射
* 参数:
* 类加载器(应用类加载器)
* 被代理类的接口
* InvocationHandler:this,当前类实现了InvocationHandler
*/
return Proxy.newProxyInstance(this.getClass().getClassLoader(),target.getClass().getInterfaces(),this);
}
/**
* 相当于一个环绕通知,切入点为调用的接口
*
* @param proxy 被代理目标
* @param method 方法
* @param args 参数
* @return
* @throws Throwable
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*
动态代理的本质就是反射
*/
method.invoke(target,args);
System.out.println(args[0]);
System.out.println("后置通知");
return null;
}
}