这是注解类

package com.example.demo.Test;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.lang.reflect.Modifier;

@Component
@Aspect
public class AspectTest {

    //@Pointcut定义切入点
    @Pointcut("execution(public * com.example.demo.controller..*.*(..))")//触发AOP注解的类的路径(也就是那些接口触发AOP)
    public void sing(){ }

    @Before("sing()")//方法之前做的事
    public void sayHi(JoinPoint joinPoint){
        System.out.println("目标方法名:" + joinPoint.getSignature().getName());
        System.out.println("目标方法所属类的简单类名:" + joinPoint.getSignature().getDeclaringType().getSimpleName());
        System.out.println("目标方法所属类的类名:" + joinPoint.getSignature().getDeclaringTypeName());
        System.out.println("目标方法声明的类型:" + Modifier.toString(joinPoint.getSignature().getModifiers()));
        //获取传入目标方法的参数
        Object[] args = joinPoint.getArgs();
        for (int i = 0; i < args.length; i++) {
            System.out.println("第" + i + "参数为:" + args[i]);
        }
        System.out.println("被代理的对象:" + joinPoint.getTarget());
        System.out.println("代理对象自己:" + joinPoint.getThis());
    }

    @After("sing()")//方法之后做的事
    public void sayThankYou(){
        System.out.println("注解后置通知[email protected]@");
    }

    @Around("sing()")//环绕切入
    public Object dosomgthing(ProceedingJoinPoint joinPoint){

        Object object = null;
        try {
            //执行方法前
            System.out.println("环绕前置通知!!!!!");
            //用新的参数执行方法
            object = joinPoint.proceed(new Object[]{"String1","String2"});
            //执行方法后
            System.out.println("!!!!!!环绕后置通知");
        } catch (Throwable throwable) {
            System.out.println("方法异常通知!!!");
            throwable.printStackTrace();
        }
        return object;
    }
}

定义接口

package com.example.demo.controller;

import com.example.demo.Test.TargetClass;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;


@RestController
public class TestController {

    @Autowired
    private TargetClass targetClass;


    @RequestMapping(value = "/say")
    public String say(String a,String b){
        return targetClass.join(a,b);
    }
}

接口中引用的类

package com.example.demo.Test;

import org.springframework.stereotype.Component;

@Component
public class TargetClass {

    public String join(String s1,String s2){
        return s1 + "+" + s2 ;
    }
}

测试

浏览器请求接口

Spring AOP注解

控制台输出结果

Spring AOP注解

相关文章: