spring切面如何设置cglib

fiy 其他 41

回复

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

    Spring切面可以使用cglib来实现。在Spring框架中,我们可以通过配置来设置使用cglib来生成代理类。

    首先,我们需要在Spring配置文件中定义一个切面。可以使用<aop:aspect>标签来定义切面,并使用ref属性来指定切面的具体实现类。

    接下来,我们需要在切面实现类中使用@Aspect注解来标识这个类是一个切面类,并且使用@Pointcut注解来定义切点,即我们需要在哪些方法上应用切面。

    在切面类中,我们可以使用@Before@After@Around等注解来定义通知,并在通知中编写具体的增强逻辑。

    使用cglib生成代理类时,需要在配置文件中设置proxy-target-class属性为true,以告诉Spring使用cglib来生成代理类而不是使用JDK动态代理。

    下面是一个示例的Spring配置文件和切面实现类:

    <!-- 配置文件 -->
    <bean id="myAspect" class="com.example.MyAspect" />
    
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    
    <!-- 切面实现类 -->
    @Aspect
    public class MyAspect {
        @Pointcut("execution(* com.example.Service.*(..))")
        public void pointcut() { }
        
        @Before("pointcut()")
        public void before() {
            System.out.println("Before advice");
        }
        
        @After("pointcut()")
        public void after() {
            System.out.println("After advice");
        }
        
        @Around("pointcut()")
        public Object around(ProceedingJoinPoint pjp) throws Throwable {
            System.out.println("Before method execution");
            Object result = pjp.proceed();
            System.out.println("After method execution");
            return result;
        }
    }
    

    上面的示例配置了一个切面,切点是com.example.Service下的所有方法。切面类中定义了beforeafteraround三个通知来实现相应的增强逻辑。同时,通过设置proxy-target-classtrue,告诉Spring使用cglib来生成代理类。

    这样,当程序执行到被切点方法时,切面的通知就会触发执行对应的增强逻辑。

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

    Spring AOP(面向切面编程)是一种在Spring框架中进行代码横向切片的机制。在Spring AOP中,可以使用两种方式来创建切面:使用Java动态代理和使用CGLIB。

    CGLIB是一个功能强大的代码生成库,它可以通过生成目标对象的子类来实现代理。在Spring AOP中,默认情况下,如果目标对象没有实现任何接口,则会使用CGLIB来创建代理对象。下面是如何在Spring中使用CGLIB创建切面的步骤:

    1. 引入相关的依赖
      首先,你需要在你的项目中引入Spring AOP和CGLIB的依赖。在Maven中,你可以在pom.xml文件中添加以下依赖:
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <dependency>
        <groupId>cglib</groupId>
        <artifactId>cglib</artifactId>
        <version>3.3.0</version>
    </dependency>
    
    1. 创建切面类
      接下来,你需要创建一个切面类,并实现一个方法,该方法将在目标方法周围执行。切面类可以使用@Aspect注解进行标注,以告诉Spring它是一个切面类。同时,你还需要将切面类添加到Spring的配置中。
    @Aspect
    @Component
    public class MyAspect {
        
        @Around("execution(* com.example.MyService.*(..))")
        public Object aroundMethod(ProceedingJoinPoint joinPoint) throws Throwable {
            // 在目标方法执行之前执行一些操作
            System.out.println("Before method execution");
            
            // 执行目标方法
            Object result = joinPoint.proceed();
            
            // 在目标方法执行之后执行一些操作
            System.out.println("After method execution");
            
            return result;
        }
    }
    
    1. 配置CGLIB代理
      默认情况下,Spring会根据目标对象是否实现接口来决定使用Java动态代理还是CGLIB代理。然而,你也可以通过配置来明确地指定使用CGLIB代理。在Spring的配置文件(如XML或Java配置)中,可以添加以下代码来配置CGLIB代理:
    <!-- 使用CGLIB代理 -->
    <aop:aspectj-autoproxy proxy-target-class="true" />
    

    这将告诉Spring使用CGLIB代理来创建代理对象。

    1. 配置目标对象
      最后,你需要配置目标对象,并确保它没有实现任何接口,这样Spring才会使用CGLIB代理。在Spring的配置文件中,可以添加以下代码来配置目标对象:
    <!-- 配置目标对象 -->
    <bean id="myService" class="com.example.MyService" />
    

    其中,com.example.MyService是你的目标对象的类名。

    1. 使用CGLIB代理
      现在,当你调用MyService的方法时,Spring会动态生成一个继承自MyService的子类,并在子类中执行切面逻辑。这就是CGLIB代理的工作原理。

    总结:
    通过引入相关的依赖,创建切面类,配置CGLIB代理,配置目标对象,最后使用CGLIB代理,就可以实现在Spring中设置CGLIB切面。

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

    Spring AOP可以使用两种代理方式:JDK动态代理和CGLIB动态代理。默认情况下,如果目标对象实现了至少一个接口,Spring AOP将使用JDK动态代理。如果目标对象没有实现接口,Spring AOP将使用CGLIB动态代理。

    要在Spring AOP中设置CGLIB代理,可以采取以下步骤:

    1. 确保在应用程序的配置文件中启用了自动代理。可以使用下面的注释将自动代理激活在配置类上:
    @EnableAspectJAutoProxy(proxyTargetClass = true)
    @Configuration
    public class AppConfig {
      // 配置类内容
    }
    
    1. 创建切面类,并在类上使用 @Aspect 注解。在切面类中定义切点和通知。

    2. 在Spring配置文件中配置切面和目标对象。确保目标对象没有实现接口。

    <bean id="targetObject" class="com.example.TargetClass"/>
    <bean id="aspect" class="com.example.AspectClass"/>
    <aop:config>
        <aop:aspect id="aspect" ref="aspect">
            <aop:pointcut id="pointcut" expression="execution(* com.example.TargetClass.*(..))"/>
            <aop:before method="beforeAdvice" pointcut-ref="pointcut"/>
        </aop:aspect>
    </aop:config>
    

    在上述配置中,可以看到 <aop:aspect> 元素中使用了 ref 属性来引用切面类,而 expression 属性用来定义切点表达式。

    1. 在Spring配置文件中配置 proxy-target-class 属性为 true,以提示Spring使用CGLIB代理。这将强制Spring使用CGLIB代理,而不管目标对象是否实现了接口。
    <aop:aspectj-autoproxy proxy-target-class="true"/>
    

    使用以上方法,可以在Spring AOP中设置CGLIB代理。这将使Spring选择CGLIB代理而不是JDK动态代理来强制实现目标对象的代理。

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

400-800-1024

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

分享本页
返回顶部