AOP简单实例

1、自定义注解


@Target(value = {ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface MyAnnotation {


}

2、切面类

@Aspect
@Component
public class MyAnnotationAspect {

    /**
     * 定义切点,拦截的位置,可避免下面重复声明变量
     */
    @Pointcut("@annotation(com.yjz.common.annotation.MyAnnotation)")
    private void pointCut(){}


//    @Before("@annotation(myAnnotation)")
//    public void doBefore(JoinPoint joinPoint, MyAnnotation myAnnotation){
//
//    }
    @Before("pointCut()")
    public void doBefore(JoinPoint joinPoint){
        System.out.println("-----切入点的相关信息-----");
        //目标方法的传入参数
        Object[] args = joinPoint.getArgs();
        System.out.println("共"+args.length+"个参数");
        for (int i = 0; i < args.length; i++) {
            System.out.println("第"+i+1+"个参数为:"+args[i]);
        }
        //获取目标方法信息
        Signature signature = joinPoint.getSignature();
        System.out.println("目标方法名为:"+signature.getName());
        System.out.println("目标方法信息:"+signature);
        //可获取所属类,然后获取所属类的相关信息
        System.out.println("目标方法所属类名:"+signature.getDeclaringTypeName());
        System.out.println("目标方法所属类简单类名:"+signature.getDeclaringType().getSimpleName());
        System.out.println("----切入点相关信息----");
        System.out.println("");

        System.out.println("step0(Before)-目标方法"+signature.getName()+"执行前的操作。。。。");
    }

    @AfterReturning("pointCut()")
    public void doAfterReturning(JoinPoint joinPoint){
        Signature signature = joinPoint.getSignature();
        System.out.println("step2(AfterReturning)-目标方法"+signature.getName()+"返回值后的操作。。。。");
    }

    @After("pointCut()")
    public void doAfter(JoinPoint joinPoint){
        Signature signature = joinPoint.getSignature();
        System.out.println("step3(After)-目标方法"+signature.getName()+"执行后的操作。。。。");

    }

    @Around("pointCut()")
    public Object doAround(ProceedingJoinPoint joinPoint){
        System.out.println("---以下内容会在Before之前执行---");
        Object[] args = joinPoint.getArgs();
        System.out.println("共"+args.length+"个参数");
        for (int i = 0; i < args.length; i++) {
            System.out.println("第"+(i+1)+"个参数的旧值为:"+args[i]);
        }
        //改变参数值
        args[0]="New Hello";
        System.out.println("参数新值:"+args[0]);
        System.out.println("---以上内容会在Before之前执行---");
        System.out.println();
        //执行目标方法
        Object result=null;
        try {
            result=joinPoint.proceed(args);
        } catch (Throwable throwable) {
            System.out.println("执行目标方法异常。");
        }

        System.out.println();
        System.out.println("---以下内容会在After之后执行---");
        if(result instanceof String){
            //改变返回值
            result="Happy New Year";
            System.out.println("增强后的返回值"+result);
        }
        System.out.println("---以上内容会在After之后执行---");

        return result;

    }


}

3、服务类

@Service
@Slf4j
public class MyAnnotationService {

    @MyAnnotation
    public String helloAop(String param){
        System.out.println("step1-方法helloAop执行开始。。。。");
        return param;
    }


}

4、接口类

@RestController
@RequestMapping("/yjz")
public class MyController {

    @Autowired
    private MyAnnotationService myAnnotationService;

    @PostMapping("/testHelloAop")
    public JSONObject testHelloAop(@RequestParam String param){
        String result=myAnnotationService.helloAop(param);
        return JSONObject.parseObject("{\"message\":\"SUCCESS\",\"code\":200,\"result\":\"" +result+
                "\"}");
    }
}

5、测试结果

---以下内容会在Before之前执行---
共1个参数
第1个参数的旧值为:hello
参数新值:New Hello
---以上内容会在Before之前执行---

-----切入点的相关信息-----
共1个参数
第01个参数为:New Hello
目标方法名为:helloAop
目标方法信息:String com.yjz.first.service.MyAnnotationService.helloAop(String)
目标方法所属类名:com.yjz.first.service.MyAnnotationService
目标方法所属类简单类名:MyAnnotationService
----切入点相关信息----

step0(Before)-目标方法helloAop执行前的操作。。。。
step1-方法helloAop执行开始。。。。
step2(AfterReturning)-目标方法helloAop返回值后的操作。。。。
step3(After)-目标方法helloAop执行后的操作。。。。

---以下内容会在After之后执行---
增强后的返回值Happy New Year
---以上内容会在After之后执行---

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值