这是我参与8月更文挑战的第3天,活动详情查看:8月更文挑战”
spring AOP 定义
AOPAspect Oriented Programming的缩写,意为:面向切面编程
AOP 要实现的是在我们原来写的代码的基础上,进行一定的包装,如在方法执行前、方法返回后、方法抛出异常后等地方进行一定的拦截处理或者叫增强处理。
核心思想:Aspect 是一种模块化机制,是用来描述分散在对象,类,函数中的横切关注点。从关注点分离出横切关注点是面向切面的程序设计的核心概念。分离关注点使解决特定领域问题的代码从业务逻辑中独立出来,业务逻辑的代码中不在含有针对特定领域问题的代码调用,业务逻辑和特定领域的问题的关系通过切面来封装,维护,这样原本分散在整个程序中的变动就可以很好的管理起来了。
spring AOP 术语
Joinpoint(连接点)
所谓的连接点是指那些被拦截到的点。在spring中,这些点指的是方法,因为spring只支持方法类型的连接点
Pointcut(切入点)
所谓的切入点,是指我们要对哪些Joinpoint进行拦截的定义
| 概念 | 定义 | 作用 | 例子 |
|---|---|---|---|
| Joinpoint | 连接点,指的是方法的执行。 | 它表示程序中可以插入切面逻辑的具体位置。 | UserService.createUser()方法执行 |
| Pointcut | 切入点,是对连接点的定义,决定哪些连接点会被拦截。 | 它通过匹配表达式来选择需要拦截的方法。 | execution(* com.example.service.*(..)) |
Advice(通知/增强)
所谓的通知就是指拦截到Jointpoint之后所要做的事情就是通知,通知分为前置通知(AspectJMethodBeforeAdvice),后置通知(AspectJAfterReturningAdvice),异常通知(AspectJAfterThrowingAdvice),最终通知(AspectAfterAdvice),环绕通知(AspectJAroundAdvice)
Advisor(通知器) :
Advisor 是包含了 Advice 和 Pointcut 的一个封装对象。完成对目标方法的切面增强设计(advice)和关注点的设计以后,需要一个对象把它们结合起来,完成这个作用的就是Advisor(通知器)。通过Advisor ,可以定义应该使用那个通知并在哪个关注点使用它。`
@Configuration public class AopConfig {
@Bean
public DefaultPointcutAdvisor loggingAdvisor() {
// 定义切入点:拦截所有以 "User" 开头的方法
NameMatchMethodPointcut pointcut = new NameMatchMethodPointcut();
pointcut.setMappedName("createUser");
// 定义增强逻辑 LoggingAdvice 是自定义的
LoggingAdvice advice = new LoggingAdvice();
// 创建 Advisor
return new DefaultPointcutAdvisor(pointcut, advice);
}
}
main 方法
public class MainApplication {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(com.example.config.AopConfig.class);
// 获取目标对象
UserService userService = context.getBean(UserService.class);
// 调用方法
userService.createUser("Amanda");
userService.deleteUser("John");
context.close();
}
}