文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

SpringAOP详解面向切面编程思想

2024-04-02 19:55

关注

1. 什么是 Spring AOP

AOP (Aspect Oriented Programming): 面向切面编程, 它是一种思想, 它是对某一类事情的集中处理.

例如, 在没有学习AOP之前, 之前的判断当前登录状态, 就需要在每一个页面都实现登录校验, 在有了AOP之后, 外面只需在某一处配置以下, 所有的页面就都可以实现登录验证了, 就不需要写太多重复的代码,

Spring AOP, 是一个框架, 提高了一种对 AOP 思想的实现.

2. AOP 的组成

2.1 切面 (Aspect)

切面由切点和通知组成, 它既包含了横切逻辑的定义, 也包括了连接点的定义.

切面是包含了: 通知, 切点和切面的类, 相当于 AOP 实现的某个功能的集合

2.2 切点 (Pointcur)

切点的作用就是提供一组规则 (使用 AspectJ pointcut expression language 来描述) 来匹配 连接点, 给满足规则的 连接点添加 Advice

切点相当于保存了众多连接点的一个集合

2.3 连接点 (Join Point)

应用执行过程中能够插入切面的一个点, 这个点可以是方法的调用时, 抛出异常时, 甚至修改字段时. 切面代码可以利用这些点插入到应用的正常流程之中, 并添加新的行为.

连接点相当于需要被增强的某个 AOP 功能的所有方法.

2.4 通知 (Advice)

定义了切面是什么, 何时使用, 其描述切面要完成的工作, 还解决何时执行这个工作的问题,

Spring切面类中, 可以在方法上使用以下注解, 会设置方法为通知方法, 在满足条件后会通知本方法进行调用.

⽅法进⾏调用:

前置通知使用 @Before:通知方法会在目标方法调用之前执行.

后置通知使用 @After:通知方法会在目标方法返回或者抛出异常后调用.

返回之后通知使用 @AfterReturning:通知方法会在目标方法返回后调用.

抛异常后通知使用 @AfterThrowing:通知方法会在目标方法抛出异常后调用.

环绕通知使用 @Around:通知包裹了被通知的方法, 在被通知的方法通知之前和调用之后执行自定义的行为.

3. Spring AOP 的使用

3.1 添加 AOP 框架

在 pom.xml 中添加依赖

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

3.2 定义切面和切点

@Aspect // 定义切面
@Component
public class UserAspect {
    // 切点 (配置拦截规则)
    @Pointcut("execution(* com.example.demo.controller.UserController.*)")
    public void pointcut() {
        // 这是一个空方法, 不需要有具体的实现
    }
}

切点表达式注意事项

AspectJ 支持三种通配符

execution() 是最常用的切点函数

语法为: execution(<修饰符> <返回类型> <包.类.方法(参数)> <异常>) (注意: 修饰符和异常可以省略)

示例:

3.3 定义通知 (五种)

@Aspect // 定义切面
@Component
public class UserAspect {
    // 切点 (配置拦截规则)
    @Pointcut("execution(* com.example.demo.controller.UserController.*(..))")
    public void pointcut() {
        // 这是一个空方法, 不需要有具体的实现
    }
    @Before("pointcut()")
    public void doBefore(){
        System.out.println("执行 Before 方法");
    }
    @After("pointcut()")
    public void doAfter(){
        System.out.println("执行 After 方法");
    }
    @AfterReturning("pointcut()")
    public void doAfterReturning() {
        System.out.println("执行 AfterReturning 方法");
    }
    @AfterThrowing("pointcut()")
    public void doAfterThrowing() {
        System.out.println("执行 AfterThrowing 方法");
    }
    @Around("pointcut()")
    public Object doAround(ProceedingJoinPoint joinPoint) {
        Object object = null;
        System.out.println("Around 方法开始执行");
        try {
            // 执行拦截方法
            object = joinPoint.proceed();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
        System.out.println("Around 方法结束执行");
        return object;
    }
}

正常时

抛出异常时

4. Spring AOP 实现原理

Spring AOP 是构建在动态代理基础上, 因此 Spring 对 AOP 的支持局限于方法级别的拦截.

Spring AOP 是基于动态代理实现的.

动态代理分为两类:

默认情况下, 实现了接口的类, 使用 AOP 会基于 JDK 生成代理类, 没有实现接口的类, 会基于 CGLIB 生成代理类

4.1 织入 (Weaving)

代理的生成时机

织⼊是把切面应用到目标对象并创建新的代理对象的过程,切面在指定的连接点被织⼊到目标对象中。

在目标对象的⽣命周期里有多个点可以进⾏织入:

4.2 JDK 和 CGLIB 实现的区别

到此这篇关于Spring AOP详解面向切面编程思想的文章就介绍到这了,更多相关Spring AOP切面编程内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯