Spring 动态代理的实现有两种方式,分别是JDK动态代理和CgLib。其中JDK动态代理需要目标对象实现接口,Cglib方式需要实现继承,如果为final类拒绝继承,则不能实现。SpringAop默认利用JDK动态代理实现。 下面介绍JDK动态代理的一个demo。
demo结构
1、定义接口package com.example.jdkproxy.demo;
public interface PrintC {
void doSomething();
}
2、给出接口的实现类
public class PrintCImpl implements PrintC {
@Override
public void doSomething() {
System.out.println("Print Hello");
}
}
3、实现JDK动态的代理
public class JDKDynamicProxy implements InvocationHandler {
private Object target;
public JDKDynamicProxy(Object target) {
this.target = target;
}
/**
* 获取被代理接口实例对象
* @param <T>
* @return
*/
public <T> T getProxy() {
return (T) Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println("Do something before");
Object result = method.invoke(target, args);
System.out.println("Do something after");
return result;
}
}
4、测试
public class BootTest {
public static void main(String[] args) {
// 动态代理实现
JDKDynamicProxy reflectionHandler = new JDKDynamicProxy(new PrintCImpl());
PrintC proxy = reflectionHandler.getProxy();
proxy.doSomething();
}
}
5、结果