[Spring 03] 静态代理和动态代理
Spring_03 AOP
3. 静态代理
三个角色:
接口:
真实角色 继承 接口
代理角色 继承 接口{组合 真实角色 并包装真实角色的方法}
好处: 1. 真实角色更加纯粹在业务方面;2. 实现了业务的分工;3. 公共业务发生扩展,方便集中管理
缺点:每个真实角色都需要一个代理角色(动态代理的原因),代码维护量翻倍
AOP的机制:
4. 动态代理
1. 分类
动态代理的作用和静态代理的一样
动态代理是在使用过程中动态产生的,不是定义好的
动态代理有两大类: 基于接口的动态代理, 基于类的动态代理
- 基于接口的动态代理: jdk
- 基于类的动态代理:jclib
- JAVA字节码的实现: javassist
2. 实现
宏观思想: 通过传入某种被代理类,灵活获得某种代理类的模式
InvocationHandle 接口: invoke()方法
Proxy类的静态方法: newProxyInstance()方法
实现思想: 给一个继承了InvocationHandle的类传入一个被代理类,获得代理类并用invoke方法实现被代理类中方法的类
//测试类:
Host host = new Host();//具体的一个房东(继承Rent接口,实现rent()方法)
ProxyBuilder proxyBuilder = new ProxyBuilder();//创建一个产生Proxy的类
proxyBuilder.setObject();//传入参数设置要产生的Proxy类的类型
Rent proxy = proxyBuilder.getProxy();//返回这个类型的代理
proxy.rent();// 执行proxy代理的方法
思路: 代理谁, 生成代理类,调用代理类的方法
//产生动态代理的类:
public class ProxyBuilder implements InvocationHandle{
//继承接口,实现invoke方法
private Object object;
public void setObject(Object object){//set方法设置object类型
this.object = object;
}
public Object getProxy(){//获取object类型的代理的方法
return Proxy.newProxyInstance(三个参数);//调用Proxy的静态方法
//参数为: 被代理类的加载器,被代理类的Class类,handle(这里是this)
}
//InvocationHandle接口中的方法,
//代理类需要做的其他事情的方法可以放在invoke中执行(代理需要做的事情)
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//在被代理类的方法调用前 的 代理类自己的方法
Object invoke = method.invoke(object, args);//传入被代理类,实现被代理类的方法,在调用时使用
return invoke;//返回值不重要
}
//代理类自己的方法
}
继承了一个接口的类,既可以是Object类型,也可以是接口类型