📜  咨询后的Spring Boot AOP(1)

📅  最后修改于: 2023-12-03 15:23:00.633000             🧑  作者: Mango

咨询后的Spring Boot AOP

什么是AOP

AOP,即面向切面编程,它的目的是分离具有横向共性的功能代码。被称为切面的模块化概念,它可以横切多个对象,所以它被称为切面。

举个例子,在一个应用程序中,事务处理、日志记录、安全检查、异常处理等等这些功能都是有多个模块共享的,而这些模块又与业务逻辑无关,这时候就可以使用AOP,把这些共性功能代码从业务代码中抽离出来,避免重复工作。

Spring Boot AOP

Spring Boot中的AOP正是利用了Spring框架自身的AOP框架来实现的。Spring框架的AOP实现基于AspectJ实现,具有AspectJ的所有特性,但不需要在编译时侵入到Java字节码中。

使用Spring Boot AOP

添加依赖

使用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:在方法执行前执行。
  • @After:在方法执行后执行,无论是否出现异常都会执行。
  • @AfterReturning:在方法成功执行后执行。
  • @AfterThrowing:在方法抛出异常后执行。
@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的使用方式,有助于程序员更好地开发应用程序。