zoukankan      html  css  js  c++  java
  • spring中的动态代理

    spring中提供了两种动态代理的方式,分别是Java Proxy以及cglib

    JavaProxy只能代理接口,而cglib是通过继承的方式,实现对类的代理

    添加一个接口以及对应的实现类

    public interface HelloInterface {
        void sayHello();
    }
    public class HelloInterfaceImpl implements HelloInterface {
        @Override
        public void sayHello() {
            System.out.println("hello");
        }
    }

    JavaProxy通过实现InvocationHandler实现代理

    public class CustomInvocationHandler implements InvocationHandler {
        private HelloInterface helloInterface;
    
        public CustomInvocationHandler(HelloInterface helloInterface) {
            this.helloInterface = helloInterface;
        }
    
        @Override
        public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
            System.out.println("before hello for proxy");
            Object result = method.invoke(helloInterface, args);
            System.out.println("after hello for proxy");
            return result;
        }
    }

    而cglib实现MethodInterceptor进行方法上的代理

    public class CustomMethodInterceptor implements MethodInterceptor {
        @Override
        public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
            System.out.println("before hello for cglib");
            Object result = methodProxy.invokeSuper(o, objects);
            System.out.println("after hello for cglib");
            return result;
        }
    
    }

    分别实现调用代码

        public static void main(String[] args) {
            Enhancer enhancer = new Enhancer();
            enhancer.setSuperclass(HelloInterfaceImpl.class);
            enhancer.setCallback(new CustomMethodInterceptor());
            HelloInterface target = (HelloInterface) enhancer.create();
            target.sayHello();
    
            CustomInvocationHandler invocationHandler = new CustomInvocationHandler(new HelloInterfaceImpl());
            HelloInterface target2 = (HelloInterface)  Proxy.newProxyInstance(Demo.class.getClassLoader(), new Class[]{HelloInterface.class}, invocationHandler);
            target2.sayHello();
        }

    可以看到对于的代理信息输出

    before hello for cglib
    hello
    after hello for cglib
    before hello for proxy
    hello
    after hello for proxy
  • 相关阅读:
    在Linux下修改图形界面的分辨率
    Linux 常用命令
    读ActiveAndroid源码(三)
    读ActiveAndroid源码(二)
    读ActiveAndroid源码(一)
    Android中图片的文件储存
    构造器内部的多态方法的行为
    摸触事件分发的小实践——关闭View滑动
    【Java】 关于类的初始化
    git配置http代理
  • 原文地址:https://www.cnblogs.com/yytxdy/p/13167719.html
Copyright © 2011-2022 走看看