这是注解类
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 ;
}
}
测试
浏览器请求接口

控制台输出结果
