SpringAop之JDK动态代理源码解析
摘要
Aop代理模式看过Spring源码同学都知道很多用了代理模式,主要对其目标类方法调用前后做增强拦截,不改变目标方法情况下实现插拔。只需要定义一组代理类实现接口,通过反射方式调用。
演示
声明目标类接口、方法
//接口
public interface UserService {
int save(String name);
void update(String name);
}
//实现类
public class UserServiceImpl implements UserService{
@Override
public int save(String name) {
System.out.println(name+"save success");
return 1;
}
@Override
public void update(String name) {
System.out.println(name+"update success");
}
}
定义代理类 (关键)
//代理类 实现InvocationHandler接口 重写invoke方法
public class UserServiceProxy implements InvocationHandler {
//目标类
private Object target;
public UserServiceProxy(Object target) {
this.target = target;
}
//invoke 负责调用
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("执行前操作....");
Object result = method.invoke(target, args);
System.out.println("执行后操作....");
return result;
}
}
启动调用
public class TestJdkProxy {
public static void main(String[] args) throws IOException {
//newProxyInstance 创建代理类
UserService proxy= (UserService)Proxy.newProxyInstance(UserService.class.getClassLoader(),
new Class[]{UserService.class},
new UserServiceProxy(new UserServiceImpl()));
//委托代理类调用目标方法 代码会进入invoke方法
proxy.save("nijo");
proxy.update("huhu");
}
}
执行前操作....
nijosave success
执行后操作....
执行前操作....
huhuupdate success
执行后操作....
源码扣核心
1. 跟newProxyInstance() 方法 3个参数
public static Object newProxyInstance(ClassLoader loader,
Class<?>[] interfaces,
I