Spring中JDK的动态代理和CGLIB代理的区别

一,应用范围

         1,如果目标对象实现了接口,在默认情况下会采用JDK的动态代理实现AOP

       2,如果目标对象实现了接口,也可以强制使用CGLIB生成代理实现AOP

       3,如果目标对象没有实现接口,必须引入CGLIB,Spring会在JDK的动态代理和CGLIB代理之间进行切换。

二,强制使用CGLIB代理

          1,引入CGLIB的Jar:

2,Spring配置文件中加入强制使用CGLIB代理

 

<!-- 强制使用CGLIB代理 -->
<aop:aspectj-autoproxy proxy-target-class="true"/>

三,小结

          1, JDK的动态代理只能对实现了接口的类进行代理:

       如上图,如果要为UserManagerImpl生成代理,这种关系下,可以使用JDK的动态代理,也可以强制使用CGLIB进行代理。

        但是如果我去掉实现关系:

           

         这时候就必须要使用CGLIB了。

        另外,CGLIB在实现动态代理的时候,主要是为指定的类生成一个子类,例如,我要对上面的UserManagerImpl生成一个代理,会继承这个类,但是这个时候,如果我们把UserManagerImpl定义为final的,就无法被继承了,也就不能生成代理类了。所以,我们的Target object最好不要声明为final的。

时间: 2024-10-30 23:10:22

Spring中JDK的动态代理和CGLIB代理的区别的相关文章

Spring AOP源码分析(二)JDK动态代理和CGLIB介绍

本篇是介绍java实现代理对象的两种方法,JDK动态代理和CGLIB.  JDK动态代理:针对你所调用的方法是接口所定义的方法.动态的创建一个类,通过实现目标类的接口来实现代理.  CGLIB:没有限制.通过继承目标类来创建代理类,实现代理.  下面看案例:  案例一,JDK动态代理:  Person和Animals都实现了Say接口sayHello方法.现在就需要对他们的sayHello方法进行拦截.  Say接口如下:  ? 1 2 3 4 public interface Say {  

java动态代理和cglib动态代理示例分享_java

java动态代理类可以分为两种. 静态代理:由程序员创建或特定工具自动生成源代码,再对其编译.在程序运行前,代理类的.class文件就已经存在了. 动态代理:在程序运行时,运用反射机制动态创建而成. 一.首先我们进行java动态代理的演示. 现在我们有一个简单的业务接口Saying,如下: 复制代码 代码如下: package testAOP;public interface Saying {public void sayHello(String name);    public void ta

spring源码学习【准备】之jdk动态代理和cglib动态代理的区别和性能

一:区别:---->JDK的动态代理依靠接口实现,如果有些类并没有实现接口,则不能使用JDK代理,这就要使用cglib动态代理了.--->JDK的动态代理机制只能代理实现了接口的类,而不能实现接口的类就不能实现JDK的动态代理,cglib是针对类来实现代理的,他的原理是对指定的目标类生成一个子类,并覆盖其中方法实现增强,但因为采用的是继承,所以不能对final修饰的类进行代理. 性能:--->jdk的动态代理由于jdk版本的升级,渐渐超越cglib  二:都说 Cglib 创建的动态代理

在Spring中如何处理配置动态代理生成不同bean实现?

问题描述 最近在做一个老系统的数据库移植工作,从oracle一直到mysql,但是由于mysql数据不完整,需要先查询mysql,如果没有再去查oracle,待完整后再去掉oracle.我的想法是,抽象出dao接口,然后2套实现逻辑,最后用代理模式处理先后查询.代码如下:publicinterfaceUserDAO{publicvoidfind();}classUserDAOOracleImplimplementsUserDAO{publicvoidfind()..}classUserDAOMy

如何在VPS上用3Proxy架设http代理和socks代理(Ubuntu环境)

3proxy是俄罗斯人开发的(怎么又是俄罗斯人,前面nginx),主页在www.3proxy.ru. 3proxy支持windows和linux等各种平台.windows下直接下载安装即可,linux下面需要自己编译. 虽然是编译安装,但是也是毫不费力. 下载.编译.安装: wget http://www.3proxy.ru/current/3proxy-0.7-devel.tgz tar zxf 3proxy-0.7-devel.tgz cd 3proxy-0.7 make –f makefi

在VPS上用3Proxy架设http代理和socks代理(Ubuntu环境)_服务器其它

3Proxy是俄罗斯人开发的(怎么又是俄罗斯人,前面nginx),主页在www.3proxy.ru. 3Proxy支持windows和linux等各种平台.windows下直接下载安装即可,Linux下面需要自己编译. 虽然是编译安装,但是也是毫不费力. 下载.编译.安装: wget http://www.3proxy.ru/current/3proxy-0.7-devel.tgz tar zxf 3proxy-0.7-devel.tgz cd 3proxy-0.7 make –f Makefi

http代理和socks代理的定义与区别_代理服务器

什么是HTTP代理:www对于每一个上网的人都再熟悉不过了,www连接请求就是采用的http协议,所以我们在浏览网页,下载数据(也可采用ftp协议)是就是用http代理.它通常绑定在代理服务器的80.3128.8080等端口上. 什么是socks代理:相应的,采用socks协议的代理服务器就是SOCKS服务器,是一种通用的代理服务器.Socks是个电路级的底层网关,是 DavidKoblas在1990年开发的,此后就一直作为Internet RFC标准的开放标准.Socks 不要求应用程序遵循特

Spring中的AOP详解

本文摘自pandonix的博客.   此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求,采用AOP来解决.一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容.本文是权当本人的自己AOP学习笔记,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 面对需求: ①对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况. ②监控部分重要函数,若抛出指定的异

关于Spring中代理类的问题

问题描述 有个现象很奇怪,我在Spring中配置业务Bean发现,在配置"TransactionProxyFactoryBean"时并不需要我指定具体业务Bean的接口是什么.而配置"ProxyFactoryBean"却需要明确配置,业务Bean所实现的接口,这是为什么?按理说既然"TransactionProxyFactoryBean"可以实现自动匹配,为什么"ProxyFactoryBean"不这样做呢? 解决方案 解决方