📅  最后修改于: 2023-12-03 15:20:12.440000             🧑  作者: Mango
本文将简单介绍 Spring AOP,AOP(面向切面编程)是一种编程范式,用以解决分散在应用程序中的横切关注点(cross-cutting concerns)的问题,比如事务管理、日志记录、安全控制等。
Spring AOP是基于代理的AOP框架,它允许开发人员使用面向切面编程技术将普通Java对象(POJO)转换为可拦截的AOP对象。Spring AOP提供了几个常见的切面(Aspect),如:
Spring AOP并不支持所有的Java语言特性(例如反射),但它可以很好地应对大多数AOP需求。
Spring AOP中有几个核心概念,重点介绍如下。
Join Point是指应用程序中的一个点,如方法执行、异常捕获、字段设置或对象初始化等。Spring AOP只支持方法级别的Join Point,所以还需使用AspectJ或其他框架来支持更丰富的Join Point。
Pointcut是一组Join Point的集合,决定哪些Join Point需要被拦截并添加额外的功能。Spring AOP中支持两种类型的Pointcut:
Advice是指在切面的某个Join Point执行时,额外添加到该Join Point的代码。Spring AOP支持如下几种Advice:
Aspect是指使用Advice拦截Pointcut所定义的Join Point的类,该类通常包含多个Advice。Aspect通过配置文件或注解来定义,Spring会在合适的时候将它们织入到目标对象中。
以下示例展示了如何在Spring AOP中使用AspectJ注解方式的切面定义和配置。
首先,我们需要添加如下依赖:
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.3.5</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.9.6</version>
</dependency>
新建一个类,并在类上注解 @Aspect
,表示该类是一个Aspect。接着在该类中添加一个方法,并在该方法上注解 @Around("execution(* hello(..))")
,表示该方法可以拦截出入参为 hello()
的方法。
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.springframework.stereotype.Component;
@Aspect
@Component
public class MyAspect {
@Around("execution(* hello(..))")
public Object doAround(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
System.out.println("Before Hello World!");
Object result = proceedingJoinPoint.proceed();
System.out.println("After Hello World!");
return result;
}
}
在 Spring 配置文件中定义该切面:
<bean id="myAspect" class="com.example.MyAspect" />
<aop:config>
<aop:aspect ref="myAspect">
<aop:pointcut id="helloMethod"
expression="execution(* hello(..))" />
<aop:around pointcut-ref="helloMethod" method="doAround" />
</aop:aspect>
</aop:config>
现在,运行应用程序并调用名称为 hello()
的方法,即可看到如下输出:
Before Hello World!
Hello World!
After Hello World!
以上就是 Spring AOP 的基本概念和实战使用方式。希望能够对您学习 AOP 有所帮助。