Spring part 三:AOP中的代理
Spring part 3:AOP中的代理
JDK动态代理
接口
public interface IService { public void method(); }
实现类
public class ServiceImpl implements IService { @Override public void method() { System.out.println("ServiceImpl--->method()"); } }
proxy
public class JDKProxy implements InvocationHandler { private Object target; public Object getProxy(Object target) { this.target = target; return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this); } @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println(proxy.getClass().toString()); System.out.println("before..."); Object invoke = method.invoke(target, args); System.out.println("after..."); return invoke; } }
测试
@Test public void demo01() { IService service = new ServiceImpl(); JDKProxy proxy = new JDKProxy(); IService serviceProxy = (IService) proxy.getProxy(service); serviceProxy.method(); } /** class $Proxy4 before... ServiceImpl--->method() after... */
JDK的这种动态代理必须基于接口,代理后的对象也必须转换为接口才能操作
CGLIB代理
接口,同上
实现类,同上
proxy
public class CGLIBProxy implements MethodInterceptor{ private Enhancer enhancer = new Enhancer(); public Object getProxy(Class<?> clazz){ //这只代理目标类 enhancer.setSuperclass(clazz); //设置回调 enhancer.setCallback(this); return enhancer.create(); } @Override public Object intercept(Object proxy, Method method, Object[] args, MethodProxy methodProxy) throws Throwable { System.out.println(proxy.getClass().toString()); System.out.println("before..."); Object invoke = methodProxy.invokeSuper(proxy, args); System.out.println("after..."); return invoke; } }
测试
@Test public void demo2() { IService service = new ServiceImpl(); CGLIBProxy proxy = new CGLIBProxy(); ServiceImpl serviceProxy = (ServiceImpl) proxy.getProxy(service.getClass()); serviceProxy.method(); } /** class demo01.ServiceImpl$$EnhancerByCGLIB$$6cb2203b before... ServiceImpl--->method() after... */
Spring AOP 底层,会判断用户是根据接口代理还是目标类代理,如果针对接口代理 使用JDK代理,如果针对目标类代理 使用Cglib代理
JDK动态代理是针对目标接口生成一个实现类该类为代理对象,目标对象和代理对象没有任何关系
CGLIB根据目标对象生成一个继承目标对象的子类,代理对象和目标对象是继承关系