AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),切点使用注解方式(二)

问题背景

通过上一篇介绍了AOP拦截不失效的实例,这个篇章介绍一下使用自己创建的注解设置切点方法
注意事项:

  • 通过下载上个篇章的源码,进行稍微修改即可

AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),解决单个方法不生效问题(一)

AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),切点使用注解方式(二)

项目搭建

1 首先自己创建一个方法注解

package com.yg.aop.Aspect;


import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

/**
 * @Author suolong
 * @Date 2022/3/31 10:47
 * @Version 1.5
 */

@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface MethodAnnotation {

}

2 添加AOP拦截新方法

package com.yg.aop.Aspect;

import com.yg.aop.dto.AopDTO;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.context.annotation.Configuration;

/**
 * @Author suolong
 * @Date 2022/3/25 16:18
 * @Version 1.5
 */
@Configuration
@Aspect   //当前类设置为切面,触发了切点方法就可以进行拦截
@Slf4j
public class AopAspect {

    //设置切点方法或者类
    @Pointcut("execution(* com.yg.aop.service.ResultServiceImpl.getResultVO(..))")
    public void getPointcut() {
    }

    //对切点方法进行前置增强,就是在调用切点方法前进行做一些必要的操作,这就成为增强
    @Before("getPointcut()")
    public void getRes(JoinPoint joinPoint) {
        log.info("Before Intercept request");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if (arg instanceof AopDTO) {
                log.info("AopDTO: {}", arg);
            }
        }
    }

    //用于配置后置通知。指定增强的方法在切入点方法之后执行,这个方式一定可以拦截到切点方法的返回值,@After拦截不到返回值
    @AfterReturning(value = "getPointcut()", returning = "result")
    public void getResult(JoinPoint joinPoint, Object result) {
        log.info("AfterReturning Intercept request");
        log.info("result: {}", result);
    }

    //用于配置最终通知。无论切入点方法执行时是否有异常,都会执行,只能拦截到入参
    @After("getPointcut()")
    public void afterTest(JoinPoint joinPoint) {
        log.info("After Intercept request");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            log.info("arg: {}", arg);
        }
    }


    //设置切点注解
    @Pointcut("@annotation(com.yg.aop.Aspect.MethodAnnotation)")
    public void getMethodAnnotation() {
    }

    //对切点方法进行前置增强,就是在调用切点方法前进行做一些必要的操作,这就成为增强
    @Before("getMethodAnnotation()")
    public void getMethodAnnotation(JoinPoint joinPoint) {
        log.info("Before Intercept getMethodAnnotation");
        Object[] args = joinPoint.getArgs();
        for (Object arg : args) {
            if (arg instanceof AopDTO) {
                log.info("getMethodAnnotation: {}", arg);
            }
        }
    }

}

3 在切点方法上添加自己创建的注解

package com.yg.aop.service;

import com.yg.aop.Aspect.MethodAnnotation;
import com.yg.aop.dto.AopDTO;
import com.yg.aop.dto.ResultVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * @Author suolong
 * @Date 2022/3/29 15:40
 * @Version 1.5
 */
@Service
@Slf4j
public class ResultServiceImpl implements ResultService{

    //拦截的方法
    @Override
    @MethodAnnotation
    public ResultVO getResultVO(AopDTO aopDTO) {
        log.info("aaaaaaaaaa");
        aopDTO.setName("jj");
        ResultVO resultVO = ResultVO.builder()
                .aopDTO(aopDTO)
                .msg("你还好吗?").build();
        log.info("resultVO: {}", resultVO);
        return resultVO;
    }

}

4 整个项目文件目录

测试代码

1 可以看出,使用注解的方式@annotation比execution更快拦截到切点方法

心得




作为程序员第 89 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha …

Lyric: 过千山万水

这是第3首歌,已经完结了,你们猜出歌名了吗?

  • 歌名:千山万水
  • 歌手:周杰伦
  • 歌词:方文山
  • 专辑:北京2008年奥运会歌曲专辑
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
AOP(面向切面编程)中,@After和@AfterReturning是两个常用的注解,用于在目标方法执行后执行一些逻辑。它们的区别如下: 1. @After注解: - @After注解标记的方法会在目标方法执行后无论是否发生异常都会被执行。 - 它类似于finally代码块,无论目标方法是否成功执行,都会执行@After注解标记的方法。 - 通常用于释放资或进行清理工作。 2. @AfterReturning注解: - @AfterReturning注解标记的方法只会在目标方法成功执行后被执行,不会在目标方法发生异常时执行。 - 它可以获取到目标方法的返回值作为数。 - 通常用于处理目标方法的返回结果。 下面是一个示例: ```java @Aspect @Component public class LoggingAspect { @After(value = "execution(* com.example.MyService.doSomething(..))") public void afterMethod(JoinPoint joinPoint) { System.out.println("执行目标方法后执行@After注解标记的方法"); } @AfterReturning(value = "execution(* com.example.MyService.doSomething(..))", returning = "result") public void afterReturningMethod(JoinPoint joinPoint, Object result) { System.out.println("目标方法返回值:" + result); System.out.println("执行目标方法成功后执行@AfterReturning注解标记的方法"); } } ``` 在上述示例中,`@After`注解标记的`afterMethod`方法会在目标方法`doSomething`执行后无论是否发生异常都会被执行。而`@AfterReturning`注解标记的`afterReturningMethod`方法只会在目标方法执行成功并且返回结果时执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值