深度学习SpringAOP(面向切面编程)

本文详细介绍了Spring的AOP(面向切面编程)概念,包括AOP的作用、应用场景、术语解析和实际开发步骤。通过AOP,可以简化代码中如日志记录等公共逻辑的实现,降低模块间的耦合度。文章还探讨了通知、通配切入点、代理模式(包括JDK和CGLIB动态代理)以及后处理器在AOP中的角色,帮助读者全面理解并掌握SpringAOP的实践应用。
摘要由CSDN通过智能技术生成


LOGO
文章已托管到GitHub,大家可以去GitHub查看阅读,欢迎老板们前来Star!
搜索关注微信公众号 【码出Offer】 领取各种学习资料!

SpringAOP


一、什么是AOP

AOP(Aspect Oriented Programming),即面向切面编程,利用一种称为"横切"的技术,剖开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

应用场景: 如日志记录、审计、声明式事务、安全性和缓存等。

二、场景分析

为了更好的理解AOP,渗透面向切面编程的思想。我这里举一个开发中很常见的例子。打印日志

首先,我们要先理解什么是日志。

日志: 日志是一种可以追踪某些软件运行时所发生事件的方法,软件开发人员可以向他们的代码中调用日志记录相关的方法来表明发生了某些事情。一个事件可以用一个可包含可选变量数据的消息来描述,此外,事件也有重要性的概念,这个重要性也可以被称为严重性级别(level)。开发者可以通过区分严重性级别来分析出想要的信息。

了解了什么是日志,那就要知道怎么打印日志,在哪里打印日志。打印日志,是引入依赖,使用日志工具来实现日志严重性级别和日志信息的打印。至于在哪里打印日志,当然是在我们项目代码中的关键位置了。

这里我们举一个例子在某一段代码的前后使用,有A、B、C三个方法,但是要在调用每一个方法之前,要求打印一行日志“某方法被调用了!”,在调用每个方法之后,也要求打印日志“某方法被调用完毕!”。

一般人会在每一个方法的开始和结尾部分都会添加一句日志打印吧,这样做如果方法多了,就会有很多重复的代码,显得很麻烦,这时候有人会想到,为什么不把打印日志这个功能封装一下,然后让它能在指定的地方(比如执行方法前,或者执行方法后)自动的去调用呢?如果可以的话,业务功能代码中就不会掺杂这一下其他的代码,所以AOP就是做了这一类的工作的。

其工作原理为JDK动态代理和CGLIB动态代理,这里就先不展开动态代理的知识了!还是先看AOP吧!

三、AOP术语

AOP作用: Spring的AOP编程即是通过动态代理类为原始类的方法添加辅助功能。

AOP术语 描述
连接点(Joinpoint) 连接点是程序类中客观存在的方法,可被Spring拦截并切入内容
切入点(Pointcut) 被Spring切入连接点
通知、增强(Advice) 可以为切入点添加额外功能,分为:前置通知、后置通知、异常通知、环绕通知等。
目标对象(Target) 代理的目标对象
引介(Introduction) 一种特殊的增强,可在运行期为类动态添加Field和Method
织入(Weaving) 把通知应用到具体的类,进而创建新的代理类的过程
代理(Proxy) 被AOP织入通知后,产生的结果类
切面(Aspect) 由切点和通知组成,将横切逻辑织入切面所指定的连接点中

四、AOP术语解析

3.1 连接点

简单来说,就是允许你使用通知、增强的地方。就比如在方法前后打印日志一样,我们可以在一段代码的前后做操作,可以在一段代码前做操作,可以在一段代码后做操作,可以在一段代码抛异常之后做操作。所以,在这里这些可以操作的一行行代码(方法等等)都是一个个的连接点。

3.2 切入点

把一个个方法等代码看作连接点,那我们从哪个位置打印日志(增强操作)呢,而我们挑选出需要打印日志的位置(也就是连接点的周围),就被称为切入点。

3.3 增强、通知

关于增强,在上面我已经说到过了,通过在切入点做的操作叫做增强,比如我们要打印日志的话,日志就是一个增强功能操作。

3.4 目标对象

目标对象,简单来说是要被增强的对象。

3.5 引介

允许我们向现有的类添加新方法属性。这不就是把切面(也就是增强定义的新方法属性)用到目标对象中

3.6 织入

把增强应用到具体的目标对象中,进而创建新的代理类的过程

3.7 代理

代理就像我们买房子的中介一样,也就是被AOP织入后产生的代理对象(中介对象),通过代理对象可以实现对我们的目标对象增强

3.8 切面

切面是通知(增强)和切入点的结合。通知说明了干什么和什么时候干,而切入点说明了在哪干,这就是一个完整的切面定义。

五、SpringAOP开发步骤

5.1 pom.xml文件引入依赖

引入Spring核心依赖(spring-context)和SpringAOP依赖(spring-aspects)

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-context</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-aspects</artifactId>
    <version>5.1.6.RELEASE</version>
</dependency>
5.2 创建spring-context.xml文件并添加schema

我们需要在核心配置文件的头文件中添加aop和context的Schema

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
       http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       ">
</beans>
5.3 定义原始类

模拟创建一个原始类

public interface UserService {
   
    public void save();
}

public class UserServiceImpl implements 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值