spring在什么版本引入cglib

worktile 其他 73

回复

共3条回复 我来回复
  • worktile的头像
    worktile
    Worktile官方账号
    评论

    Spring 在版本3.2.0 引入了 CGLIB。

    在 Spring 的早期版本中,它主要使用了标准的 Java 动态代理(JDK Proxy)来实现 AOP(面向切面编程)功能。然而,标准的 Java 动态代理只能代理接口,并且在对方法进行拦截时有一些限制。为了解决这些限制并提供更灵活的 AOP 功能,Spring 引入了 CGLIB。

    CGLIB 是一个强大的第三方库,它基于字节码操作来生成代理类。相对于标准的 Java 动态代理,CGLIB 代理允许我们代理具体的类而不仅仅是接口。通过修改类的字节码,CGLIB 可以在运行时生成子类来代理目标类的方法。这就为 Spring 框架提供了更大的灵活性。

    在 Spring 3.2.0 版本之前,使用 CGLIB 需要手动配置。然而,从 Spring 3.2.0 开始,Spring 将 CGLIB 作为默认的代理方式。这意味着,如果目标类没有实现接口,Spring 将自动使用 CGLIB 在运行时生成代理类。

    要在 Spring 中使用 CGLIB,我们可以通过在 Spring 配置文件中添加 <aop:config> 元素并设置 proxy-target-class 属性为 true 来启用 CGLIB 代理。

    <aop:config proxy-target-class="true">
        <!-- 其他 AOP 配置 -->
    </aop:config>
    

    通过这种配置方式,我们可以在 Spring 中更方便地使用 CGLIB 代理提供的强大功能,比如代理类的方法拦截、增强等。

    总之,Spring 在 3.2.0 版本引入了 CGLIB,使得我们可以更方便地使用类级别的代理,提供更灵活的 AOP 功能。

    1年前 0条评论
  • fiy的头像
    fiy
    Worktile&PingCode市场小伙伴
    评论

    Spring在3.2版本开始引入CGLIB。

    CGLIB是一个开源的第三方类库,它是基于ASM(一个Java字节码操纵框架)的。CGLIB可以在运行时动态生成字节码并进行类的增强。在Spring框架中,CGLIB被用于实现动态代理,主要用于实现基于类的代理。

    在Spring 3.2版本之前,Spring主要使用Java反射机制和JDK的动态代理来实现AOP(面向切面编程)。但是,JDK动态代理只能对实现了接口的类进行代理,对于没有实现接口的类则无法进行代理。为了解决这个问题,Spring引入了CGLIB作为动态代理的一种选择。

    Spring 3.2版本引入了对CGLIB的支持,通过配置<aop:config proxy-target-class="true"/>,可以强制Spring使用CGLIB来创建代理对象。当然,默认情况下,Spring仍然会优先使用JDK的动态代理。

    从Spring 4.0版本开始,CGLIB成为了Spring AOP默认的代理方式。这意味着,当目标类没有实现接口时,Spring会自动使用CGLIB来创建代理对象,无需进行额外的配置。

    总结起来,Spring在3.2版本引入了CGLIB,并且从4.0版本开始,CGLIB成为了Spring AOP默认的代理方式。通过CGLIB,Spring可以对没有实现接口的类进行代理,提供更加灵活的AOP实现。

    1年前 0条评论
  • 不及物动词的头像
    不及物动词
    这个人很懒,什么都没有留下~
    评论

    Spring在3.0版本中开始引入了CGLIB(Code Generation Library),用于实现动态代理。在此之前,Spring使用的是JDK动态代理(基于接口)。

    下面将详细介绍Spring中CGLIB的引入过程以及使用方法。

    1. Spring引入CGLIB的原因
      在JDK动态代理中,只能为接口创建代理对象,而不能为类创建代理对象。这在某些情况下可能会存在限制,因为并不是所有的类都有对应的接口。为了克服JDK动态代理的限制,Spring引入了CGLIB。CGLIB是一个强大的代理工具,它可以为任何类创建代理对象,而不仅仅是接口。

    2. Spring版本与CGLIB的对应关系
      从Spring 3.x版本开始,Spring默认使用CGLIB作为动态代理。在3.x版本之前,Spring使用JDK动态代理来创建代理对象。以下是Spring版本与CGLIB的对应关系:

    • Spring 1.x – 2.x:默认使用JDK动态代理
    • Spring 3.x – 5.x:默认使用CGLIB动态代理

    在Spring 3.x之后的版本中,默认使用CGLIB动态代理来创建代理对象。

    1. 如何启用和配置CGLIB动态代理
      默认情况下,Spring会自动选择合适的代理方式,无需额外配置。但是,我们也可以通过配置来显式地启用或禁用CGLIB动态代理。

    通过XML配置:
    在XML配置文件中,可以使用aop:config元素来启用或禁用CGLIB动态代理。以下是一个示例配置:

    <aop:config proxy-target-class="true">
        <!-- 代理对象的配置 -->
    </aop:config>
    

    上述配置中,通过在"proxy-target-class"属性中设置"true"来启用CGLIB动态代理。如果将其设置为"false",则会使用JDK动态代理。

    通过注解配置:
    在使用注解的方式配置Spring AOP时,可以使用@EnableAspectJAutoProxy注解来启用CGLIB动态代理。以下是一个示例配置:

    @Configuration
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    public class AppConfig {
        // 配置其他相关的bean或组件
    }
    

    上述配置中,通过在@EnableAspectJAutoProxy注解中设置"proxyTargetClass"属性为"true"来启用CGLIB动态代理。

    1. 使用CGLIB动态代理
      无论是使用XML配置还是注解配置启用了CGLIB动态代理,我们可以在代码中使用Spring AOP来创建代理对象。

    通过XML配置:
    在XML配置文件中,可以使用aop:aspect元素来定义切面,然后使用aop:advisoraop:pointcut元素来配置增强和切入点。以下是一个示例配置:

    <bean id="targetBean" class="com.example.TargetBean" />
    
    <bean id="aspectBean" class="com.example.AspectBean" />
    
    <aop:config proxy-target-class="true">
        <aop:aspect ref="aspectBean">
            <aop:before method="beforeMethod" pointcut="execution(* com.example.TargetBean.*(..))" />
        </aop:aspect>
    </aop:config>
    

    上述配置中,通过在aop:config元素中设置"proxy-target-class"属性为"true"来启用CGLIB动态代理。然后,使用aop:aspectaop:before元素来定义切面和增强。

    通过注解配置:
    在使用注解配置的方式中,可以使用@Autowired和@Aspect注解来定义切面和增强。以下是一个示例配置:

    @Aspect
    @Component
    public class AspectBean {
    
        @Before("execution(* com.example.TargetBean.*(..))")
        public void beforeMethod() {
            // 前置增强的逻辑
        }
    }
    
    @Configuration
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    @ComponentScan("com.example")
    public class AppConfig {
        // 配置其他相关的bean或组件
    }
    

    上述配置中,通过@EnableAspectJAutoProxy注解中设置"proxyTargetClass"属性为"true"来启用CGLIB动态代理。然后,使用@Autowired和@Aspect注解来定义切面和增强。

    总结:
    Spring从3.0版本开始引入了CGLIB动态代理,用于代替JDK动态代理。通过配置,我们可以启用或禁用CGLIB动态代理。在使用Spring AOP时,我们可以使用XML配置或注解配置来定义切面和增强逻辑。无论是哪种方式,CGLIB动态代理都可以为类创建代理对象,提供更大的灵活性和功能。

    1年前 0条评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部