内容简介: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动态代理。
总结
- JDK动态代理基于接口,要求委托了必须实现接口,如果没有实现接口的话JDK动态带就无能为力了。
- CGlib动态代理不要求委托类实现接口,CGlib使用的是继承机制,代理类继承委托类。CGlib要求委托类不能是final的,否则会创建代理失败,因为final类是不允许继承的。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 动态代理三部曲(一):动态代理模式及实现原理
- 你必须会的 JDK 动态代理和 CGLIB 动态代理
- 彻底搞懂jdk动态代理并自己动手写一个动态代理
- Java 静态代理和动态代理的使用及原理解析
- 动态代理与RPC
- JAVA动态代理
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
UNIX环境高级编程(第3版)
史蒂文斯 (W.Richard Stevens)、拉戈 (Stephen A.Rago) / 戚正伟、张亚英、尤晋元 / 人民邮电出版社 / 2014-6-1 / 128.00元
《UNIX环境高级编程(第3版)》是被誉为UNIX编程“圣经”的Advanced Programming in the UNIX Environment一书的第3版。在本书第2版出版后的8年中,UNIX行业发生了巨大的变化,特别是影响UNIX编程接口的有关标准变化很大。本书在保持前一版风格的基础上,根据最新的标准对内容进行了修订和增补,反映了最新的技术发展。书中除了介绍UNIX文件和目录、标准I/......一起来看看 《UNIX环境高级编程(第3版)》 这本书的介绍吧!