📅  最后修改于: 2023-12-03 15:23:00.633000             🧑  作者: Mango
AOP,即面向切面编程,它的目的是分离具有横向共性的功能代码。被称为切面的模块化概念,它可以横切多个对象,所以它被称为切面。
举个例子,在一个应用程序中,事务处理、日志记录、安全检查、异常处理等等这些功能都是有多个模块共享的,而这些模块又与业务逻辑无关,这时候就可以使用AOP,把这些共性功能代码从业务代码中抽离出来,避免重复工作。
Spring Boot中的AOP正是利用了Spring框架自身的AOP框架来实现的。Spring框架的AOP实现基于AspectJ实现,具有AspectJ的所有特性,但不需要在编译时侵入到Java字节码中。
使用Spring Boot AOP,首先需要在pom.xml文件中添加依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
定义一个切面需要三个元素:切入点、通知和切面。
切入点定义了哪些方法需要被拦截,它通常是一个正则表达式。
@Pointcut("execution(* com.example.demo.service.*.*(..))")
public void pointcut() {}
上面的切入点表示拦截com.example.demo.service
包下的所有方法。
通知是切面的具体实现,它可以在切入点执行前、执行后、异常发生时、返回结果后等不同的时间点执行。
常用的通知类型有以下几种:
@Before("pointcut()")
public void before(JoinPoint joinPoint) {
// 在方法执行之前执行
}
上述代码表示在切入点方法执行之前执行before
方法。
切面是切入点和通知的结合体,它可以定义多个切入点和通知。
@Aspect
@Component
public class MyAspect {
@Pointcut("execution(* com.example.demo.service.*.*(..))")
public void pointcut() {}
@Before("pointcut()")
public void before(JoinPoint joinPoint) {
// 在方法执行之前执行
}
}
上述代码定义了一个名为MyAspect
的切面,它拦截com.example.demo.service
包下的所有方法,并在方法执行之前执行before
方法。
在Spring Boot应用中,我们需要使用@EnableAspectJAutoProxy
注解启用AOP代理,并把切面添加到Spring容器中。
@SpringBootApplication
@EnableAspectJAutoProxy
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Bean
public MyAspect myAspect() {
return new MyAspect();
}
}
上述代码中,添加@EnableAspectJAutoProxy
注解启用AOP自动代理,添加myAspect
方法把切面添加到Spring容器中。
Spring Boot AOP是一种优秀的AOP框架,它可以轻松地实现基于切面的编程,从而提高代码的重用性和灵活性。理解Spring Boot AOP的使用方式,有助于程序员更好地开发应用程序。