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更快拦截到切点方法
心得
- 不管是自己创建的注解方式还是execution方式拦截单个方法,都是需要满足这个单个方法是通过其他类调用,并不是当类调用
- 获取主机注解里面的方式1
- 获取主机注解里面的方式2
作为程序员第 89 篇文章,每次写一句歌词记录一下,看看人生有几首歌的时间,wahahaha …
Lyric: 过千山万水
这是第3首歌,已经完结了,你们猜出歌名了吗?
- 歌名:千山万水
- 歌手:周杰伦
- 歌词:方文山
- 专辑:北京2008年奥运会歌曲专辑
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/110786.html