spring源码-aop动态代理-5.3
一、动态代理,这是一个很强大的东西哦。研发过程中我们会常用很多业务类,但是存在一个问题。如何在不修改源码逻辑的情况下,加入自己的相关逻辑。比如异常处理,日志记录等!
二、Java动态代理的两种方式JDK、CGLIB
三、动态代理的例子
1)需要代理的类
public interface AspectExcuteParent { void test(); } public class AspectExcuteChild implements AspectExcuteParent{ public void test() { System.out.println("test"); } }
2)JDK代理(因为JDK的代理是基于接口做的,所以需要实现一个接口)
public static void main(String[] args) { //创建代理 AspectExcuteParent aspectExcuteParent = (AspectExcuteParent) Proxy.newProxyInstance( //classloader Thread.currentThread().getContextClassLoader(), //代理接收的接口 AspectExcuteChild.class.getInterfaces(), //代理类 new TestInvocationHandler(new AspectExcuteChild())); aspectExcuteParent.test(); } static class TestInvocationHandler implements InvocationHandler{ //所以私有化,目的执行 private Object object; public TestInvocationHandler(Object object) { super(); this.object = object; } /** * @param proxy (代理实例) * @param method (方法) * @param args (参数) * @return * @throws Throwable */ @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { System.out.println("before"); Object result = method.invoke(object, args); System.out.println("after"); return result; } }
3)cglib的实现方式(基于类的方式实现)
public static void main(String[] args) { //CGLIB创建类 Enhancer enhancer = new Enhancer(); //设置目标代理 enhancer.setSuperclass(AspectExcuteChild.class); //设置回掉 enhancer.setCallback(new TestMethodInterceptor(new AspectExcuteChild())); //创建代理 AspectExcuteChild aspectExcuteChild = (AspectExcuteChild) enhancer.create(); aspectExcuteChild.test(); } static class TestMethodInterceptor implements MethodInterceptor { //保存的原始对象 private Object object; public TestMethodInterceptor(Object object) { super(); this.object = object; } @Override public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable { //方法拦截处理 System.out.println("before"); Object result = method.invoke(object, objects); System.out.println("after"); return result; } }
四、动态代理的例子就这么多,aop中对代理进行了封装,但是基本处理方式就是这样的。