package com.springboot.demo.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Order(1)
public class TestAspect1 {
/*
* java.lang.String com.springboot.demo.controller包及任何子包下面的,
* 以DemoController开头的任何类的方法(方法有一个类型为HttpServletRequest的参数)
*/
@Pointcut
("execution(java.lang.String com.springboot.demo.controller..DemoController*.*(..)) && "
+ "args(javax.servlet.http.HttpServletRequest)")
private void a() {};
@Around("a()")
public Object b(ProceedingJoinPoint joinPoint){
System.out.println("------执行 TestAspect1类 逻辑 1------");
Object resp = null;
try {
resp = joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("------执行 TestAspect1类 逻辑 2------");
return resp;
}
}
package com.springboot.demo.aspect;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Order(2)
public class TestAspect2 {
/*
* java.lang.String com.springboot.demo.controller包及任何子包下面的,
* 以DemoController开头的任何类的方法(方法有一个类型为HttpServletRequest的参数)
*/
@Pointcut
("execution(java.lang.String com.springboot.demo.controller..DemoController*.*(..)) && "
+ "args(javax.servlet.http.HttpServletRequest)")
private void a() {};
@Around("a()")
public Object b(ProceedingJoinPoint joinPoint){
System.out.println("------执行 TestAspect2类 逻辑 1------");
Object resp = null;
try {
resp = joinPoint.proceed();
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("------执行 TestAspect2类 逻辑 2------");
return resp;
}
}
package com.springboot.demo.aspect;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;
@Aspect
@Component
@Order(0)
public class TestAspect3 {
/*
* java.lang.String com.springboot.demo.controller包及任何子包下面的,
* 以DemoController开头的任何类的方法(方法有一个类型为HttpServletRequest的参数)
*/
@Pointcut
("execution(java.lang.String com.springboot.demo.controller..DemoController*.*(..)) && "
+ "args(javax.servlet.http.HttpServletRequest)")
private void a() {};
@Before("a()")
public void b(JoinPoint joinPoint) {
System.out.println("------执行 TestAspect3类 逻辑 ------");
System.out.println();
}
}
package com.springboot.demo.controller;
import javax.servlet.http.HttpServletRequest;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController1 {
@PostMapping(path="/test1")
@ResponseBody
public String test1(HttpServletRequest request) {
System.out.println("Hello test1!");
return "Hello test1!";
}
}
执行结果:
------执行 TestAspect3类 逻辑 ------
------执行 TestAspect1类 逻辑 1------
------执行 TestAspect2类 逻辑 1------
Hello test2!
------执行 TestAspect2类 逻辑 2------
------执行 TestAspect1类 逻辑 2------