动态代理
动态代理和静态代理角色一样
动态代理的代理类是生成的,不是我们直接写好的
动态代理分为两大类:基于接口的动态代理,基于类的动态代理
基于接口:JDK动态代理
基于类:cglib
java字节码实现:javasist
需要了解两个类:Proxy:生成代理对象,InvocationHandler:调用处理程序
生成代理对象类(基于接口)
//工具类
public class ProxyInvocationHandler implements InvocationHandler {
//被代理接口
private Object target;
public void setTarget(Object target) {
this.target = target;
}
//获取代理实例
public Object getProxy(){
return Proxy.newProxyInstance(this.getClass().getClassLoader(),
target.getClass().getInterfaces(),this);
}
//处理代理实例
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
msg(method.getName());
Object object = method.invoke(target, args);
return object;
}
public void msg(String ms){
System.out.println("执行了"+ms+"方法");
}
}
接口类
public interface UserService {
public void insert();
public void delete();
public void update();
public void query();
}
实现类
public class ServiceImpl implements UserService {
@Override
public void insert() {
System.out.println("添加一条");
}
@Override
public void delete() {
System.out.println("删除一条");
}
@Override
public void update() {
System.out.println("修改一条");
}
@Override
public void query() {
System.out.println("查询一条");
}
}
测试类
public class Client {
public static void main(String[] args) {
ServiceImpl userService = new ServiceImpl();
ProxyInvocationHandler handler = new ProxyInvocationHandler();
handler.setTarget(userService);//设置被代理对象
UserService proxy = (UserService)handler.getProxy();//动态生成代理对象
proxy.delete();
}
}
动态代理的好处
静态代理的好处都有。
一个动态代理类代理的是一个接口。一般就是对应的一类业务
一个动态代理类可以代理多个类,只要是实现了同一个接口即可。