问题:spring框架通过Cglib自动生成代理类,由于这些代理类一直占用内存,长时间会导致内存溢出
请问spring框架一定是自动通过Cglib生成代理类的吗?可以不用CGlib自动生成吗?

解决方案 »

  1.   

    spring默认代理实现时采用java层次的InvocationHandler实现的,但是被代理类必须是定业业务接口并且实现,因为java生成的代理类也实现了这个接口
    cglib不要求被代理类定义接口,它是通过继承的关系实现代理的!!!如果你的被代理类没有实现任何接口,那就会采用cglib生成代理!
      

  2.   

    回答#1楼 不使用的代理类也不会被垃圾回收,tomcat启动后,就会自动产生许多代理类
    回答#2楼 在我的项目中有dto类,在tomcat启动时就会在内存中产生 许多dto的CGlib代理类
    我的dto如下,不是实现了接口吗 ,为什么还是CGlib的呢?public class UserDTO implements Comparable<UserDTO>, Serializable, Cloneable
      

  3.   

    你想要代理来实现,肯定要用内存啊,不管是JDK的动态代理还是CGLIB
      

  4.   


    我指的接口是业务接口,而不是JDK的接口( Comparable <UserDTO>, Serializable, Cloneable)
    public interface UserDao {
     //.......
    }其实你不用管那些代理对象,如果没有引用,垃圾回收器会自动回收的!
      

  5.   

    spring默认代理实现时采用java层次的InvocationHandler实现的,但是被代理类必须是定业业务接口并且实现,因为java生成的代理类也实现了这个接口 
    cglib不要求被代理类定义接口,它是通过继承的关系实现代理的!!! 
      

  6.   

    cglib代理和jdk动态代理1 如果目标对象实现了接口,默认情况下会使用jdk的动态代理实现AOP2 如果目标对象实现了接口、可以强制使用cglib实现aop
          加入 cglib-nodep.jar
          加入 <aop:aspectj-autoproxy proxy-target-class="true"/>强制使用cglib

    3 如果目标对象没有实现了接口,必须采用cglib库,spring会在jdk动态代理和cglib之间转换
    jdk动态代理和cglib动态代理(字节码生成)区别
    * jdk动态代理只能对实现了接口的类生成代理,而不能针对没有实现接口的类代理
    * cglib是针对类实现代理、主要是对指定的类生成一个子类,覆盖了其中的方法
      因为是继承。所以该类或方法最好不要声明成final,导致无法继承父类生成代理类