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

导读:本篇文章讲解 AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),切点使用注解方式(二),希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

问题背景

通过上一篇介绍了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 整个项目文件目录
AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),切点使用注解方式(二)

测试代码

1 可以看出,使用注解的方式@annotation比execution更快拦截到切点方法
AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),切点使用注解方式(二)

心得

作为程序员第 89 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha …
AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),切点使用注解方式(二)AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),切点使用注解方式(二)AOP注解@Before、@AfterReturning拦截单个方法的入参和出参,纯注解方式(附源码下载),切点使用注解方式(二)

Lyric: 过千山万水

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

  • 歌名:千山万水
  • 歌手:周杰伦
  • 歌词:方文山
  • 专辑:北京2008年奥运会歌曲专辑

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/110786.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!