Springboot-aop使用
1.aop简介
在软件业,AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是OOP的延续,是软件开发中的一个热点,也是Spring框架中的一个重要内容,是函数式编程的一种衍生范型。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。
2.使用
在springboot中aop功能时默认开启的,关闭直接在配置中设置为false,springboot简化开发,省去了大量配置,使用aop进行是十分简单灵活的
spring:
aop:
auto: false
引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
定义注解
@Target
标识该注解作用于方法上
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface InvokeLog {
}
定义切面类
@Aspect
标识切面,@Component
注入到容器中
@Pointcut
定义切点方法,
@Around()
对哪个切点方法进行增强
// 标识切面
@Aspect
@Component
public class InvokeLogAspect {
// 定义切点方法
@Pointcut("@annotation(com.example.springboot.aop.InvokeLog)")
public void pt() {
}
@Around("pt()")
public Object printInvokeLog(ProceedingJoinPoint joinPoint) {
Object proceed = null;
MethodSignature signature = (MethodSignature)joinPoint.getSignature();
String name = signature.getMethod().getName();
System.out.println(name + "方法调用前");
try {
// 目标方法调用后
proceed = joinPoint.proceed();
System.out.println(name + "方法调用后");
} catch (Throwable e) {
e.printStackTrace();
}
return proceed;
}
}
使用
@Override
@InvokeLog
public List<User> getAll() {
System.out.println("----------------------------------");
return userMapper.getAll();
}
测试
getAll方法调用前
----------------------------------
2023-03-13 14:59:39.844 INFO 27068 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource : defaultDataSource - Starting...
2023-03-13 14:59:40.762 INFO 27068 --- [nio-8080-exec-1] com.zaxxer.hikari.HikariDataSource : defaultDataSource - Start completed.
getAll方法调用后