Spring AOP统一功能处理(切面、切点、连接点、通知)(上)

简介: Spring AOP统一功能处理(切面、切点、连接点、通知)(上)

一、 AOP的一些前置知识

1.1什么是Aop

Aop是一种统一处理某一问题的思想,比如验证用户是否登录


在为使用Aop的时候,我们需要验证的每个类(页面)都有调用验证方法,而使用了Aop后,我们只需要在某处把验证规则配置一下,就可以实现对需要验证的类的登录验证,不用每个类在重复调用验证方法了。


Aop由切面、切点、连接点、通知组成


切面表示我们要统一处理的功能(类)——比如验证用户是否登录

切点则是是否进行Aop拦截的规则(哪些页面不需要进行登录验证,哪些需要,这种规则)


连接点则是具体到哪些页面需要进行拦截(哪些类需要调用登录验证方法)

通知则是验证用户是否登录的那个具体方法实现(代码细节)——》前置通知,后置通知  


156b79dac6f0436d856644058d60958b.png

而AOP是一种思想,而SpringAOP是这个框架对AOP思想的实现(类似IoC和DI)


1.2 AOP的作用

想象一个场景,我们在做后台系统时,除了登录和注册等几个功能不需要做用户登录验证之外,其他几乎所有页面调用的前端控制器(Controller)都需要先验证用户登录的状态,那么这个时候我们要怎么处理呢?


如果不使用AOP,我们之前的处理方式是每个Controller都要写一遍用户登录验证,然而当你的功能越来越多,那么你要写的登录验证也越来越多,就有了很多重复的代码,而且这些方法的代码修改和维护的成本就会很高。

使用AOP,在进入业务代码之前进行统一的一个处理,去验证用户是否登录。

除了统一的用户登录判断之外,AOP还可以实现:

统一日志记录

统一方法执行时间统计

统一的返回格式设置

统一的异常处理

事务的开启和提交


也就是说使用AOP可以扩充多个对象的某个能力,所以AOP可以说是OOP(Object Oriented Programming)面向对象编程的补充和完善。

 

1.3AOP基础组成

AOP由以下四部分组成:

1.切面(Aspect):定义AOP业务类型(表示当前AOP是做什么的)。

2.连接点(Join Point):有可能调用AOP的地方就叫做一个连接点。

3.切点(Pointcut):定义AOP拦截规则。

4.通知(Advice)【增强方法】:定义什么时候干什么事(代码的实现细节,前后顺序)。

通知定义的是被拦截的方法具体要执行的业务,比如用户登录权限验证方法就是具体要执行的业务。

a) 前置通知:在拦截的目标方法之前执行的通知(事件)

b)后置通知:在拦截的目标方法之后执行的通知(事件)

c)返回之后通知:在拦截的目标方法返回数据之后通知

d)抛出异常之后的通知:在拦截的目标方法抛出异常之后执行的通知

e)环绕通知:在拦截方法执行前后都执行的通知。


AOP整个组成部分的概念如下图所示,以多个页面都要访问用户登录权限为例


2d27d00426374199b0865da8b805fb98.png

二、SpringAOP的实现

2.1添加SpringAOP框架支持

在我们的项目的pom.xml中添加支持

<!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-aop -->
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>

Spring AOP 框架, 在创建新项目的时候,搜索不到。

Spring Boot 项目中,有没有内置 AOP 框架。

这个时候,我们就需要借助 中央仓库了https://mvnrepository.com/ 


19a319aa8bd541e09f9ff86961bdf201.png


细节拓展: Spring AOP 依赖的版本号标签是可以省略的。

虽然 Spring AOP 没有 作为一个常用框架,导致我们引入框架的时候,需要借助 Maven 中央仓库来引入。

但是!Spring Boot 里面,其实有记录 Spring AOP 的 版本关联信息、
它可根据当前项目的环境,自动引入合适版本的 Spring AOP.


2.2定义切面(Aspect)

e196ff58d1ff48ebadc5a6d67cabfaab.png

bbf2a0dd944c4ffd95699b6ebea580d4.png

2.3定义切点(Pointcut)


aeac154830704c68ab4ac22b1444c6b3.png

其中pointcut方法为空方法,其不需要方法体,此方法名就是起到一个“标识”的作用,标识下面的通知方法具体指的是哪个切点。


d635a2963a444735902147d6fd1576d3.png

 

切点表达式说明

AspectJ支持三种通配符

  • *:匹配任意字符,只匹配一个元素(包,类,或方法,方法参数)
  • ..:匹配任意字符,可以匹配多个元素,在表示类时,必须和*联合使用
  • +:表示按照类型匹配指定类的所有类,必须跟在类名后面,如com.cad.Car+,表示继承该类的所有子类包括本身

表达式示例如下:

execution(* com.example.demo.UserController. *(..)):匹配UserController类里的所有方法。

execution(* com.example.demo.UserController+.*(..)):匹配UserController类的子类包括该类的所有方法

execution(* com.example.demo.*.*(..)):匹配com.example.demo包下的所有类的所有方法

execution(* com.example.demo..*.*(..)):匹配com.example.demo包下、子孙包下所有类的所有方法

execution(* addUser(String,int)):匹配addUser方法,且第一个参数类型是String,第二个参数类型是int

相关文章
|
7天前
|
Java 数据库连接 数据库
Spring基础3——AOP,事务管理
AOP简介、入门案例、工作流程、切入点表达式、环绕通知、通知获取参数或返回值或异常、事务管理
Spring基础3——AOP,事务管理
|
16天前
|
NoSQL 前端开发 Java
使用 Spring Boot + Neo4j 实现知识图谱功能开发
在数据驱动的时代,知识图谱作为一种强大的信息组织方式,正逐渐在各个领域展现出其独特的价值。本文将围绕使用Spring Boot结合Neo4j图数据库来实现知识图谱功能开发的技术细节进行分享,帮助读者理解并掌握这一技术栈在实际项目中的应用。
77 4
|
20天前
|
缓存 Java 开发者
Spring高手之路22——AOP切面类的封装与解析
本篇文章深入解析了Spring AOP的工作机制,包括Advisor和TargetSource的构建与作用。通过详尽的源码分析和实际案例,帮助开发者全面理解AOP的核心技术,提升在实际项目中的应用能力。
18 0
Spring高手之路22——AOP切面类的封装与解析
|
19天前
|
Java Spring XML
掌握面向切面编程的秘密武器:Spring AOP 让你的代码优雅转身,横切关注点再也不是难题!
【8月更文挑战第31天】面向切面编程(AOP)通过切面封装横切关注点,如日志记录、事务管理等,使业务逻辑更清晰。Spring AOP提供强大工具,无需在业务代码中硬编码这些功能。本文将深入探讨Spring AOP的概念、工作原理及实际应用,展示如何通过基于注解的配置创建切面,优化代码结构并提高可维护性。通过示例说明如何定义切面类、通知方法及其应用时机,实现方法调用前后的日志记录,展示AOP在分离关注点和添加新功能方面的优势。
30 0
|
19天前
|
Java Spring 监控
危机时刻,Spring框架如何拯救你的应用?深入探讨健康检查与自我修复功能
【8月更文挑战第31天】在现代软件架构中,应用的稳定性和可用性至关重要。本文介绍Spring框架中的健康检查与自我修复机制,通过Spring Boot Actuator的`/health`端点监控应用状态,并结合Spring Cloud Hystrix实现服务容错和断路器功能,提高应用健壮性。借助这些工具,开发者能轻松监控应用健康状况并在发现问题时自动采取措施,确保服务高可用性。要实现完善的机制,需根据具体应用架构和需求进行配置和扩展。
36 0
|
30天前
|
缓存 Java Maven
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
Java本地高性能缓存实践问题之SpringBoot中引入Caffeine作为缓存库的问题如何解决
|
2月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
2月前
|
Java 应用服务中间件 开发者
Java面试题:解释Spring Boot的优势及其自动配置原理
Java面试题:解释Spring Boot的优势及其自动配置原理
96 0
|
1天前
|
Java 应用服务中间件 开发者
深入探索并实践Spring Boot框架
深入探索并实践Spring Boot框架
13 2
|
22天前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
27 0