Spring AOP动态代理

栏目: Java · 发布时间: 5年前

内容简介:IOC和AOP是Spring中最重要的两个概念,而AOP最核心的部分在于动态代理。Spring AOP中的拦截功能都是通过动态代理来生成的。 那么什么是动态代理呢?所谓动态代理是指代理类是在JVM运行时动态生成的,与之相对的是静态代理。静态代理中代理类是在编译期生成的,静态代理相对动态代理来说效率会更高,但是会生成大量的代理类,不利于开发。而动态代理虽然效率会低一些,但是其大大提高了代码的简洁度和开发工作。有关二者的具体比较可以参照我前面的额博文:Spring AOP的动态代理主要有两种实现方式:JDK动态

IOC和AOP是Spring中最重要的两个概念,而AOP最核心的部分在于动态代理。Spring AOP中的拦截功能都是通过动态代理来生成的。 那么什么是动态代理呢?所谓动态代理是指代理类是在JVM运行时动态生成的,与之相对的是静态代理。静态代理中代理类是在编译期生成的,静态代理相对动态代理来说效率会更高,但是会生成大量的代理类,不利于开发。而动态代理虽然效率会低一些,但是其大大提高了代码的简洁度和开发工作。有关二者的具体比较可以参照我前面的额博文: Java中的静态代理和动态代理

Spring AOP的动态代理主要有两种实现方式:JDK动态代理(JDK Dynamic Proxy)和CGlib动态代理。JDK动态代理是基于 Java 反射功能来实现的,而CGlib动态代理借助于ASM字节码生成 工具 来生成代理类。两者各有优劣:JDK动态代理相对来说效率更高,而CGlib动态代理相对更加灵活。下面我们通过一个例子来说明如何使用两者进行动态代理。

使用JDK动态代理

定义接口和实现类

interface HelloService {
    void sayHello();
}

class HelloServiceImpl implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("Hello World!");
    }
}
复制代码

实现动态代理类

class HelloServiceDynamicProxy {

    private HelloService helloService;
    public HelloServiceDynamicProxy(HelloService helloService) {
        this.helloService = helloService;
    }

    public Object getProxyInstance() {
        return Proxy.newProxyInstance(helloService.getClass().getClassLoader(), helloService.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                System.out.println("JDK Dynamic Proxy, Before say hello...");
                Object ret = method.invoke(helloService, args);
                System.out.println("JDK Dynamic Proxy, After say hello...");
                return ret;
            }
        });
    }
}
复制代码

测试类

public class HelloServieDynamicProxyTest {
    public static void main(String[] args){
        HelloService helloService = new HelloServiceImpl();
        HelloService dynamicProxy = (HelloService) new HelloServiceDynamicProxy(helloService).getProxyInstance();
        dynamicProxy.sayHello();
    }
}
复制代码

输出结果

JDK Dynamic Proxy, Before say hello...
Hello World!
JDK Dynamic Proxy, After say hello...
复制代码

使用CGlib实现动态代理

定义接口和实现类

interface HelloService {
    void sayHello();
}

class HelloServiceImpl implements HelloService {
    @Override
    public void sayHello() {
        System.out.println("Hello World!");
    }
}
复制代码

实现动态代理类

class HelloServiceCgLibProxy implements MethodInterceptor {

    private HelloService helloService;

    public HelloServiceCgLibProxy(HelloService helloService) {
        this.helloService = helloService;
    }

    public Object createProxy() {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(helloService.getClass());
        enhancer.setCallback(this);
        return enhancer.create();
    }

    @Override
    public Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        System.out.println("CGlib Dynamic Proxy, Before say hello...");
        Object ret = method.invoke(helloService, objects);
        System.out.println("CGlib Dynamic Proxy, After say hello...");
        return ret;
    }
}
复制代码

测试类

public class HelloServieCGlibDynamicProxyTest {
    public static void main(String[] args){
        HelloService helloService = new HelloServiceImpl();
        HelloServiceCgLibProxy helloServiceCgLibProxy = new HelloServiceCgLibProxy(helloService);
        HelloService helloServiceProxy = (HelloService) helloServiceCgLibProxy.createProxy();
        helloServiceProxy.sayHello();
    }
}


复制代码

输出结果

CGlib Dynamic Proxy, Before say hello...
Hello World!
CGlib Dynamic Proxy, After say hello...
复制代码

指定Spring AOP的动态代理方式

<aop:config proxy-target-class="true">
</aop:config>
复制代码

通过配置Spring的中 <aop:config> 标签来显示的指定使用动态代理机制 proxy-target-class=true 表示使用CGLib代理,如果为false就是默认使用JDK动态代理。

总结

  1. JDK动态代理基于接口,要求委托了必须实现接口,如果没有实现接口的话JDK动态带就无能为力了。
  2. CGlib动态代理不要求委托类实现接口,CGlib使用的是继承机制,代理类继承委托类。CGlib要求委托类不能是final的,否则会创建代理失败,因为final类是不允许继承的。

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

ASO优化道与术

ASO优化道与术

ASO100研究院 / 东方出版中心 / 2017-6 / 49

应用商店搜索优化(App Store Optimization),简称ASO,广义上是指针对App在应用商店中的搜索、榜单、推荐等流量入口进行优化,有效提升用户量的行为。 本书作为本领域的第一本读物,主要针对App最常见的推广平台:iOS及Android,从多个维度,全面地介绍了ASO的操作方式。针对App Store推广的特殊性,特别解读了精品推荐、审核规则等iOS推广重点技能,同时率先带......一起来看看 《ASO优化道与术》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

随机密码生成器
随机密码生成器

多种字符组合密码

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具