Spring是一个广泛应用的框架,SpringAOP则是Spring提供的一个标准易用的aop框架,依托Spring的IOC容器,提供了极强的AOP扩展增强能力,对项目开发提供了极大地便利
什么是Spring AOP
- AOP是面向切面编程。OOP是面向对象编程,AOP是一种思想,它是针对程序中的某一类的功能做统一的处理。比如用户登录权限的校验,没学AOP之前,我们所有需要判断用户登录的页面,AOP可以自动帮我们实现登录验证,不再需要每个方法中都写相同的用户登录的验证了。
- Spring AOP是一种框架,提供了一种对AOP 思想的实现,他们的关系和IoC与DI类似。
- 利用AOP可以对各个业务进行隔离, 从而是得业务各逻辑之间的耦合性降低, 提高了程序的可重用性, 同时提高开发效率
为什么要用AOP?
- 之前处理用户登录的状态验证,每个Controller都要写一遍用户登录,然而当你的功能越来越多的时候,你要写的登录验证也越来越多,而这些方法都是相同的,对于这种功能统一,且使用的地方较多的功能,就可以考虑AOP来统一处理
- 除了统一的用户登录的判断之外,AOP还可以实现:统一日志记录,统一方法执行时间的统计,统一的返回格式设置,统一的异常处理,事务的开启和提交
AOP的组成
- 切面:切面由切点和通知组成,针对于某一个功能的具体定义(相当于一个类),某一个功能可能是登录验证功能(一个AOP一个数据库),也可能是日志记录功能,一个功能对应一个切面。
- 切点:切点是切面中的某一个方法,用户登录验证方法就是一个切点。
- 连接点:调用这些切点(方法)的页面就是连接点
- 通知: 切点是一个空方法,通知是具体实现了这个方法,通知相当于切点的方法体。通知包括:前置通知,后置通知,返回之后通知,抛异常后的通知,环绕通知
Spring AOP的实现
- 添加Spring AOP框架支持
- 定义切面和切点
- 定义通知
导入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
定义切面和切点
- 类注解:@Aspect,@Component
- 方法注解:@Pointcut
@Component
@Aspect //定义切面
public class UserAspect {
@Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
public void pointcut(){}
}
定义通知Advice(5类)
- 通知是描述拦截执行的时机和具体的方法实现
- 注意环绕通知的写法,可以记录执行接口的时间
@Component
@Aspect //定义切面
public class UserAspect {
@Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
public void pointcut(){}
// 前置通知(要带一个括号)
@Before("pointcut()")
public void doBefore(){
//业务代码
System.out.println();
System.out.println("执行了前置通知");
System.out.println();
}
}
@Around("pointcut()")
public Object doAround(ProceedingJoinPoint joinPoint){
Object result = null;
//执行前置业务代码
System.out.println("执行环绕通知的前置方法");
try {
//执行(拦截的)业务方法
result = joinPoint.proceed();
} catch (Throwable throwable) {
throwable.printStackTrace();
}
//执行后置业务代码
System.out.println("执行环绕通知的后置方法");
return result;
}
到此这篇关于Spring针对AOP详细讲解的文章就介绍到这了,更多相关Spring AOP内容请搜索编程学习网以前的文章希望大家以后多多支持编程学习网!
沃梦达教程
本文标题为:Spring针对AOP详细讲解
基础教程推荐
猜你喜欢
- Java文件管理操作的知识点整理 2023-05-19
- springboot自定义starter方法及注解实例 2023-03-31
- JDK数组阻塞队列源码深入分析总结 2023-04-18
- Java实现线程插队的示例代码 2022-09-03
- Java并发编程进阶之线程控制篇 2023-03-07
- java基础知识之FileInputStream流的使用 2023-08-11
- Java数据结构之对象比较详解 2023-03-07
- ConditionalOnProperty配置swagger不生效问题及解决 2023-01-02
- java实现多人聊天系统 2023-05-19
- Java实现查找文件和替换文件内容 2023-04-06