一)、在pom.xml文件增加以下配置
<!--不指定版本的原因,如不指定版本,会默认下载springboot对应版本的jar -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
二)、编写一个controller类,该类主要用于测试
package com.oysept.springboot.controller;
import java.util.ArrayList;
import java.util.List;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
/**
*
* @author ouyangjun
*/
@RestController
@RequestMapping(value="/aspectj")
public class AspectJController {
// http://localhost:8080/aspectj/methodOne
@RequestMapping(value="/methodOne")
public String methodOne() {
return "Hello one!";
}
// http://localhost:8080/aspectj/methodTwo?param1=aaa
@RequestMapping(value="/methodTwo")
public String methodTwo(@RequestParam("param1")String param1) {
System.out.println("==>methodThree, param1:"+param1);
return "Hello two!";
}
// http://localhost:8080/aspectj/methodThree?param1=aaa¶m2=bbb
@RequestMapping(value="/methodThree")
public List<Object> methodThree(@RequestParam("param1")String param1,
@RequestParam("param2")String param2) {
System.out.println("==>参数打印: methodThree, param1:"+param1+", param2:"+param2);
List<Object> list = new ArrayList<Object>();
list.add("value1");
list.add(1);
list.add("value2");
list.add(2.0);
return list;
}
}
三)、编写一个aop环绕通知类
package com.oysept.springboot.aop;
import java.util.Arrays;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.AfterReturning;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;
/**
* 请求参数打印aop
* @author ouyangjun
* 注: @Aspect是spring aop切入点语法
* @Component是把该类纳入spring容器中管理
*/
@Aspect
@Component
public class ArgsAop {
/**
* 匹配规则
* execution: 用于匹配方法执行的连接点;
* execution(public * *(..)) ==> 匹配所有目标类的public方法,第一个*代表返回类型,第二个*代表方法名,而..代表任意入参的方法。
* execution(* com.oysept.springboot.controller..*.*(..)) ==> 该包及所有子包下任何类的任何方法。
* execution(* com.oysept.springboot.controller.*(..)) ==> 该包下任何类的任何方法。
* execution(* com.oysept.springboot.controller.AspectJController.*(..)) ==> 该包下AspectJController类的任何方法。
* execution(* com..*.*Controller.method*(..)) ==> 匹配包名前缀为com的任何包下类名后缀为Controller的方法,方法名必须以method为前缀。
* execution(* *To(..)) ==> 匹配目标类所有以To为后缀的方法。
* 注: 该方法只是为了声明一个公共的环绕通知,也可以直接在具体方法配置,如: @Around("execution(* com.oysept.springboot.controller..*.*(..))")
*/
@Pointcut(
"execution(* com.oysept.springboot.controller..*.*(..))"
)
public void agrsAop() {}
/**
* 环绕通知,可以根据execution规则配置多个方法
* @param point
* @return
*/
@Around("agrsAop()")
public Object doProcess(ProceedingJoinPoint point) throws Throwable {
System.out.println("==>@Around begin----- ");
Object[] objArgs = point.getArgs();
for(Object obj : objArgs) {
System.out.print("args: "+obj + "\t");
}
System.out.println();
System.out.println("==>@Around end----- ");
return point.proceed();
}
@Before("agrsAop()")
public void before(JoinPoint point) throws Throwable {
System.out.println("==>@Before begin----- ");
Object[] objArgs = point.getArgs();
for(Object obj : objArgs) {
System.out.print("args: "+obj + "\t");
}
System.out.println();
System.out.println("==>@Before end----- ");
}
@After("agrsAop()")
public void releaseResource(JoinPoint point) {
System.out.println("==>@After:目标方法:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName());
System.out.println("==>@After:参数:" + Arrays.toString(point.getArgs()));
System.out.println("==>@After:被织入的目标对象:" + point.getTarget());
}
@AfterReturning(pointcut="agrsAop()", returning="returnValue")
public void log(JoinPoint point, Object returnValue) {
System.out.println("==>@AfterReturning:目标方法:" + point.getSignature().getDeclaringTypeName() + "." + point.getSignature().getName());
System.out.println("==>@AfterReturning:参数:" + Arrays.toString(point.getArgs()));
System.out.println("==>@AfterReturning:返回值:" + returnValue);
System.out.println("==>@AfterReturning:被编译目标对象:" + point.getTarget());
}
}
四)、最后直接启动springboot项目,访问http://localhost:8080/aspectj/methodThree?param1=aaa¶m2=bbb
本章完结,待续!
本文说明:该文章属于原创,如需转载,请标明文章转载来源
来源:https://blog.csdn.net/p812438109/article/details/99104176