spring的环绕通知怎么写

不及物动词 其他 53

回复

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

    Spring的环绕通知可以通过实现org.aopalliance.intercept.MethodInterceptor接口来实现。具体步骤如下:

    1. 创建一个类,并实现MethodInterceptor接口。
    import org.aopalliance.intercept.MethodInterceptor;
    import org.aopalliance.intercept.MethodInvocation;
    
    public class AroundAdvice implements MethodInterceptor {
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            // 在方法调用前执行的逻辑
            System.out.println("环绕通知:方法调用前");
    
            // 调用目标方法
            Object result = invocation.proceed();
    
            // 在方法调用后执行的逻辑
            System.out.println("环绕通知:方法调用后");
    
            return result;
        }
    }
    
    1. 在Spring配置文件中配置切面和通知。
    <bean id="aroundAdvice" class="com.example.AroundAdvice"/>
    
    <aop:config>
        <aop:aspect id="aroundAspect" ref="aroundAdvice">
            <aop:pointcut id="myPointcut" expression="execution(* com.example.MyClass.myMethod(..))"/>
            
            <aop:around pointcut-ref="myPointcut" method="invoke"/>
        </aop:aspect>
    </aop:config>
    
    1. 其中,com.example.MyClass是目标对象,myMethod是要增强的方法。

    以上就是使用Spring实现环绕通知的步骤。当目标方法被调用时,环绕通知会在方法调用前后执行额外的逻辑,并可以对目标方法的返回值进行处理。

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

    Spring的环绕通知(Around Advice)是AOP(面向切面编程)的一种类型。它可以在目标方法的执行前后以及异常抛出时进行切面处理。在Spring中,环绕通知是一种比较强大的通知类型,因为它可以完全控制目标方法的执行。

    下面是编写Spring环绕通知的步骤:

    1. 创建一个切面类并实现org.aspectj.lang.ProceedingJoinPoint接口。该接口提供了proceed方法,用于调用目标方法。示例代码如下:
    import org.aspectj.lang.ProceedingJoinPoint;
    import org.aspectj.lang.annotation.Around;
    import org.aspectj.lang.annotation.Aspect;
    import org.springframework.stereotype.Component;
    
    @Aspect
    @Component
    public class MyAspect {
    
        @Around("execution(* com.example.MyService.*(..))")
        public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
            // 在目标方法执行之前的逻辑
            System.out.println("Before method execution");
    
            // 调用目标方法
            Object result = joinPoint.proceed();
    
            // 在目标方法执行之后的逻辑
            System.out.println("After method execution");
    
            return result;
        }
    }
    
    1. 在切面类上使用@Aspect注解表示该类是一个切面类。同时,使用@Component注解将切面类交由Spring管理。

    2. 在环绕通知方法上使用@Around注解,并使用切点表达式定义需要切入的目标方法。在上面的示例中,切入点表达式execution(* com.example.MyService.*(..))表示切入com.example.MyService类的所有方法。

    3. 在环绕通知方法中,可以在目标方法执行之前进行一些前置处理逻辑,然后调用joinPoint.proceed()方法来调用目标方法。之后,可以在目标方法执行之后进行一些后置处理逻辑。可以通过joinPoint.proceed()方法的返回值来获取目标方法的结果。

    需要注意的是,在环绕通知方法中,调用joinPoint.proceed()方法之前视为在目标方法执行之前,调用joinPoint.proceed()方法之后视为在目标方法执行之后。

    1. 可以在环绕通知方法中捕获目标方法抛出的异常,并进行相应的处理逻辑。

    除了上述步骤外,还需要在Spring的配置文件中开启AOP的自动代理功能。具体的配置可以参考Spring官方文档。

    以上是编写Spring环绕通知的基本步骤和示例代码。根据实际需求,还可以在环绕通知方法中添加其他的逻辑,以实现更加灵活和复杂的切面处理。

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

    Spring的环绕通知是AOP(面向切面编程)的一种实现方式,它可以在方法执行的前后,以及抛出异常时执行一段额外的逻辑。在Spring中,可以通过@Around注解或实现MethodInterceptor接口来实现环绕通知。

    下面是使用两种方式实现Spring的环绕通知的具体步骤:

    1. 使用@Around注解实现环绕通知:

    首先,需要在配置类上添加@EnableAspectJAutoProxy注解来启用Spring的AOP功能。

    @Configuration
    @EnableAspectJAutoProxy
    public class AppConfig {
        // 配置其他的Bean
    }
    

    然后,在切面类中定义一个带有@Around注解的方法,并在方法中编写环绕通知的逻辑。

    @Aspect
    @Component
    public class LoggingAspect {
        
        @Around("execution(* com.example.demo.MyService.*(..))")
        public Object aroundAdvice(ProceedingJoinPoint joinPoint) throws Throwable {
            System.out.println("Before method execution");
            
            // 执行目标方法
            Object result = joinPoint.proceed();
            
            System.out.println("After method execution");
            
            return result;
        }
    }
    

    上述示例中,@Around注解中的参数是一个切入点表达式,用来指定哪些方法需要应用环绕通知。在aroundAdvice方法中,可以使用ProceedingJoinPoint参数来获取目标方法的信息,通过调用proceed()方法来执行目标方法。

    1. 实现MethodInterceptor接口实现环绕通知:

    首先,创建一个切面类,实现MethodInterceptor接口,并重写intercept()方法。

    @Component
    public class LoggingInterceptor implements MethodInterceptor {
    
        @Override
        public Object invoke(MethodInvocation invocation) throws Throwable {
            System.out.println("Before method execution");
            
            // 执行目标方法
            Object result = invocation.proceed();
            
            System.out.println("After method execution");
            
            return result;
        }
    }
    

    然后,在配置类中注册切面类,并将切面类配置为方法拦截器。

    @Configuration
    public class AppConfig {
        
        @Bean
        public LoggingInterceptor loggingInterceptor() {
            return new LoggingInterceptor();
        }
        
        @Bean
        public Advisor advisor() {
            AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
            pointcut.setExpression("execution(* com.example.demo.MyService.*(..))");
            
            return new DefaultPointcutAdvisor(pointcut, loggingInterceptor());
        }
        
        // 配置其他的Bean
    }
    

    上述示例中,使用AspectJExpressionPointcut来指定切入点表达式,然后通过DefaultPointcutAdvisor将切面类和切入点表达式组合在一起,并将切面类配置为方法拦截器。

    注意:切面类(无论是使用@Around还是实现MethodInterceptor接口)需要使用@Component注解将其注册到Spring容器中,以便自动扫描到切面。另外,确保在配置类中启用AOP功能。

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

400-800-1024

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

分享本页
返回顶部