SpringBoot项目中AOP的使用小Demo
普通注解AOP
目录结构
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
WebLogAspect.java
package com.demo.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class WebLogAspect {
//定义切点,方法名就是切点的名称
@Pointcut("execution(public * com.demo.controller..*.*(..))")//切入点描述 这个是controller包的切入点
public void controllerLog() {
}
@Before("controllerLog()") //在切入点的方法之前
public void logBeforeController(JoinPoint joinPoint) {
//System.out.println("joinPoint = " + joinPoint);
System.out.println("===================Before===================");
}
@After("controllerLog()") //在切入点的方法run之后
public void logAfterController(JoinPoint joinPoint) {
//System.out.println("joinPoint = " + joinPoint);
System.out.println("===================After===================");
}
/**
* 返回数据前执行
* @param joinPoint
*/
@AfterReturning("controllerLog()")
public void logAfterReturningController(JoinPoint joinPoint) {
//System.out.println("joinPoint = " + joinPoint);
System.out.println("===================AfterReturning===================");
}
/**
* 抛出异常后执行
* @param joinPoint
*/
@AfterThrowing("controllerLog()")
public void logAfterThrowingController(JoinPoint joinPoint) {
//System.out.println("joinPoint = " + joinPoint);
System.out.println("===================AfterThrowing===================");
}
// @Around("controllerLog()")
// public void logAroundController(JoinPoint joinPoint) {
// System.out.println("joinPoint = " + joinPoint);
// System.out.println("===================Around===================");
// }
}
DemoController.java
package com.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/getLog")
public void getLog() throws Exception {
System.out.println("=============调用了方法=============");
//throw new Exception("测试AfterThrowing的异常");
}
}
DemoApplication.java
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
application.properties
server.port=8080
自定义注解AOP
目录结构
依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>2.3.12.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>5.2.15.RELEASE</version>
</dependency>
LogTrack.java
package com.demo.aop;
import com.demo.pojo.Type;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 自定义注解
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
public @interface LogTrack {
/**
* 操作类型
*
* @return
*/
public Type OperationType() default Type.OTHER;
/**
* 接口名称
*
* @return
*/
public String InterfaceName() default "普通接口";
}
WebLogAspect.java
package com.demo.aop;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;
import java.lang.reflect.Method;
@Aspect
@Component
public class WebLogAspect {
//定义切点,方法名就是切点的名称
//把切点定义在某个包下
// @Pointcut("execution(* com.demo.controller..*.*(..))")//切入点描述 这个是controller包的切入点
//把切点定义在自定义注解上
@Pointcut("@annotation(com.demo.aop.LogTrack)")
public void controllerLog() {
}
@Before("controllerLog()") //在切入点的方法之前
public void logBeforeController(JoinPoint joinPoint) {
getCustomerAnnotationInfo(joinPoint);
System.out.println("=============调用了Before方法=============");
}
/**
* 获取自定义注解参数内容
*
* @param joinPoint
*/
public void getCustomerAnnotationInfo(JoinPoint joinPoint) {
String targetName = joinPoint.getTarget().getClass().getName();
String methodName = joinPoint.getSignature().getName();
Object[] arguments = joinPoint.getArgs();
Class targetClass = null;
try {
targetClass = Class.forName(targetName);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
Method[] methods = targetClass.getMethods();
String name = "";
String type = "";
for (Method method : methods) {
if (method.getName().equals(methodName)) {
Class[] clazzs = method.getParameterTypes();
if (clazzs.length == arguments.length) {
name = method.getAnnotation(LogTrack.class).InterfaceName();
type = method.getAnnotation(LogTrack.class).OperationType().toString();
System.out.println("name = " + name);
System.out.println("type = " + type);
break;
}
}
}
}
}
DemoApplication.java
package com.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
DemoController.java
package com.demo.controller;
import com.demo.aop.LogTrack;
import com.demo.pojo.Type;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class DemoController {
@GetMapping("/getLog")
@LogTrack(OperationType = Type.SELECT, InterfaceName = "查询日志")
public void getLog() {
System.out.println("=============调用了getLog方法=============");
}
@GetMapping("/getLog2")
public void getLog2() {
System.out.println("=============调用了getLog2方法=============");
}
}
Type.java
package com.demo.pojo;
/**
* 业务操作类型
*
* @author ruoyi
*/
public enum Type {
/**
* 其它
*/
OTHER,
/**
* 新增
*/
INSERT,
/**
* 修改
*/
UPDATE,
/**
* 删除
*/
DELETE,
/**
* 查询
*/
SELECT,
/**
* 导出
*/
EXPORT
}
application.properties
server.port=8080
测试
启动项目后,访问:localhost:8080/getLog,控制台打印结果如下:
访问:localhost:8080/getLog2,控制台打印结果如下: