Spring-Aop面向切面编程

news2024/11/25 2:23:07

文章目录

  • 一、简介
    • 1、作用
    • 2、AOP核心概念
    • 3、五种(增强)通知类型
  • 二、AOP入门小案例(注解版)
    • 1.导入坐标(pom.xml)
    • 2.制作连接点(原始操作,Dao接口与实现类)
    • 3:定义通知类和通知
    • 4:定义切入点
    • 5:制作切面
    • 6:将通知类配给容器并标识其为切面类
    • 7:开启注解格式AOP功能
    • 8:运行程序
    • 注:报错解决:Unsupported class file major version 61
      • 注解1:@EnableAspectJAutoProxy
      • 注解2:@Aspect
      • 注解3:@Pointcut
      • 注解4:@Before
  • 三、AOP的工作流程
  • 四、AOP配置管理
    • 1、AOP切入点表达式
      • 1.1 格式
      • 1.2通配符
  • Spring AOP的增强处理类型


一、简介

  • AOP(Aspect Oriented Programming)面向切面编程,一种编程范式,指导开发者如何组织程序结构。

    • OOP(Object Oriented Programming)面向对象编程

1、作用

  • 在不惊动原始设计的基础上为其进行功能增强
  • Spring理念:无入侵式
  • 核心概念
    • 代理(Proxy):SpringAOP的核心本质是采用代理模式实现的
    • 连接点(JoinPoint):在SpringAOP中,理解为任意方法的执行
    • 切入点(Pointcut):匹配连接点的式子,也是具有共性功能的方法描述
    • 通知(Advice):若干个方法的共性功能,在切入点处执行,最终体现为一个方法
    • 切面(Aspect):描述通知与切入点的对应关系
    • 目标对象(Target):被代理的原始对象成为目标对象

2、AOP核心概念

  • 连接点(JoinPoint):程序执行过程中的任意位置,粒度为执行方法、抛出异常、设置变量等
    • 在SpringAOP中,理解为方法的执行
  • 切入点(Pointcut):匹配连接点的式子
    • 在SpringAOP中,一个切入点可以描述一个具体方法,也可也匹配多个方法
      • 一个具体的方法:如com.itheima.dao包下的BookDao接口中的无形参无返回值的save方法
      • 匹配多个方法:所有的save方法,所有的get开头的方法,所有以Dao结尾的接口中的任意方法,所有带有一个参数的方法
    • 连接点范围要比切入点范围大,是切入点的方法也一定是连接点,但是是连接点的方法就不一定要被增强,所以可能不是切入点。
  • 通知(Advice):在切入点处执行的操作,也就是共性功能
    • 在SpringAOP中,功能最终以方法的形式呈现
  • 通知类:定义通知的类
  • 切面(Aspect):描述通知与切入点的对应关系。

3、五种(增强)通知类型

  • 1、前置增强:在执行业务方法之前先执行的增强方法
  • 2、后置增强:在执行业务方法之后没有出现异常情况下执行的增强方法
  • 3、异常增强:在执行业务方法的过程中出现了异常的情况下执行的增强方法
  • 4、最终增强:在执行业务方法中不管有没有异常都会执行的增强方法
  • 5、环绕增强(重点)
    • 环绕通知依赖形参ProceedingJoinPoint才能实现对原始方法的调用
    • 环绕通知可以隔离原始方法的调用执行
    • 环绕通知返回值设置为Object类型
    • 环绕通知中可以对原始方法调用过程中出现的异常进行处理

二、AOP入门小案例(注解版)

在方法执行前输出当前系统时间。

在这里插入图片描述

1.导入坐标(pom.xml)

<dependencies>
    <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-context</artifactId>
        <version>5.2.10.RELEASE</version>
    </dependency>
    <dependency>
    <groupId>org.aspectj</groupId>
    <artifactId>aspectjweaver</artifactId>
    <version>1.9.4</version>
	</dependency>
</dependencies>
  • 因为spring-context中已经导入了spring-aop,所以不需要再单独导入spring-aop
  • 导入AspectJ的jar包,AspectJ是AOP思想的一个具体实现,Spring有自己的AOP实现,但是相比于AspectJ来说比较麻烦,所以我们直接采用Spring整合ApsectJ的方式进行AOP开发。

2.制作连接点(原始操作,Dao接口与实现类)

public interface BookDao {
    public void save();
    public void update();
}

@Repository
public class BookDaoImpl implements BookDao {

    public void save() {
        System.out.println(System.currentTimeMillis());
        System.out.println("book dao save ...");
    }

    public void update(){
        System.out.println("book dao update ...");
    }
}

3:定义通知类和通知

public class MyAdvice {
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

4:定义切入点

public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

切入点定义依托一个不具有实际意义的方法进行,即无参数、无返回值、方法体无实际逻辑。

5:制作切面

public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

6:将通知类配给容器并标识其为切面类

@Component
@Aspect
public class MyAdvice {
    @Pointcut("execution(void com.itheima.dao.BookDao.update())")
    private void pt(){}
    
    @Before("pt()")
    public void method(){
        System.out.println(System.currentTimeMillis());
    }
}

7:开启注解格式AOP功能

@Configuration
@ComponentScan("com.itheima")
@EnableAspectJAutoProxy
public class SpringConfig {
}

8:运行程序

public class App {
    public static void main(String[] args) {
        ApplicationContext ctx = new AnnotationConfigApplicationContext(SpringConfig.class);
        BookDao bookDao = ctx.getBean(BookDao.class);
        bookDao.update();
    }
}

注:报错解决:Unsupported class file major version 61

jdk版本过高

  • 目前的最新版本springboot2.5.4最高支持JDK16

注解1:@EnableAspectJAutoProxy

名称@EnableAspectJAutoProxy
类型配置类注解
位置配置类定义上方
作用开启注解格式AOP功能

注解2:@Aspect

名称@Aspect
类型类注解
位置切面类定义上方
作用设置当前类为AOP切面类

注解3:@Pointcut

名称@Pointcut
类型方法注解
位置切入点方法定义上方
作用设置切入点方法
属性value(默认):切入点表达式

注解4:@Before

名称@Before
类型方法注解
位置通知方法定义上方
作用设置当前通知方法与切入点之间的绑定关系,当前通知方法在原始切入点方法前运行

三、AOP的工作流程

1:Spring容器启动
2:读取所有切面配置中的切入点
3:初始化bean
4:获取bean执行方法

四、AOP配置管理

1、AOP切入点表达式

  • 切入点:要进行增强的方法
  • 切入点表达式:要进行增强的方法的描述方式

1.1 格式

描述方式一:执行com.itheima.dao包下的BookDao接口中的无参数update方法

execution(void com.itheima.dao.BookDao.update())

描述方式二:执行com.itheima.dao.impl包下的BookDaoImpl类中的无参数update方法

execution(void com.itheima.dao.impl.BookDaoImpl.update())

因为调用接口方法的时候最终运行的还是其实现类的方法,所以上面两种描述方式都是可以

对于切入点表达式的语法为:

  • 切入点表达式标准格式:动作关键字(访问修饰符 返回值 包名.类/接口名.方法名(参数) 异常名)

对于这个格式,我们不需要硬记,通过一个例子,理解它:

execution(public User com.itheima.service.UserService.findById(int))
  • execution:动作关键字,描述切入点的行为动作,例如execution表示执行到指定切入点
  • public:访问修饰符,还可以是public,private等,可以省略
  • User:返回值,写返回值类型
  • com.itheima.service:包名,多级包使用点连接
  • UserService:类/接口名称
  • findById:方法名
  • int:参数,直接写参数的类型,多个类型用逗号隔开
  • 异常名:方法定义中抛出指定异常,可以省略

1.2通配符

  • *:单个独立的任意符号,可以独立出现,也可以作为前缀或者后缀的匹配符出现
  execution(public * com.itheima.*.UserService.find*(*))

匹配com.itheima包下的任意包中的UserService类或接口中所有find开头的带有一个参数的方法

  • ..:多个连续的任意符号,可以独立出现,常用于简化包名与参数的书写
  execution(public User com..UserService.findById(..))

匹配com包下的任意包中的UserService类或接口中所有名称为findById的方法

  • +:专用于匹配子类类型
  execution(* *..*Service+.*(..))

这个使用率较低,描述子类的,咱们做JavaEE开发,继承机会就一次,使用都很慎重,所以很少用它。*Service+,表示所有以Service结尾的接口的子类。

  • 案例:
    在这里插入图片描述
execution(void com.itheima.dao.BookDao.update())
匹配接口,能匹配到
execution(void com.itheima.dao.impl.BookDaoImpl.update())
匹配实现类,能匹配到
execution(* com.itheima.dao.impl.BookDaoImpl.update())
返回值任意,能匹配到
execution(* com.itheima.dao.impl.BookDaoImpl.update(*))
返回值任意,但是update方法必须要有一个参数,无法匹配,要想匹配需要在update接口和实现类添加参数
execution(void com.*.*.*.*.update())
返回值为void,com包下的任意包三层包下的任意类的update方法,匹配到的是实现类,能匹配
execution(void com.*.*.*.update())
返回值为void,com包下的任意两层包下的任意类的update方法,匹配到的是接口,能匹配
execution(void *..update())
返回值为void,方法名是update的任意包下的任意类,能匹配
execution(* *..*(..))
匹配项目中任意类的任意方法,能匹配,但是不建议使用这种方式,影响范围广
execution(* *..u*(..))
匹配项目中任意包任意类下只要以u开头的方法,update方法能满足,能匹配
execution(* *..*e(..))
匹配项目中任意包任意类下只要以e结尾的方法,update和save方法能满足,能匹配
execution(void com..*())
返回值为void,com包下的任意包任意类任意方法,能匹配,*代表的是方法
execution(* com.itheima.*.*Service.find*(..))
将项目中所有业务层方法的以find开头的方法匹配
execution(* com.itheima.*.*Service.save*(..))
将项目中所有业务层方法的以save开头的方法匹配

Spring AOP的增强处理类型

增强处理类型特点
before前置增强处理,在目标方法前织入增强处理
AfterReturning后置增强处理,在目标方法正常执行(不出现异常)后织入增强处理
AfterThrowing异常增强处理,在目标方法抛出异常后织入增强处理
After最终增强处理,不论方法是否抛出异常,都会在目标方法最后织入增强处理
Around环绕增强处理,在目标方法的前后都可以织入增强处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/4666.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux操作系统

Linux 基础入门 Linux操作系统 操作系统 首先&#xff0c;我们需要知道什么是操作系统&#xff1a; 操作系统是应用程序运行的基础支撑环境操作系统作用是管理与控制计算机系统硬件与软件资源&#xff08;软件与硬件的中间层&#xff09;Intel X86 架构上的常见的操作系统&…

linux基本指令(上)

文章目录1.whomai指令2. pwd指令3. ls 指令1. ls指令2. ls -l指令3.ls -la指令1. cd .2. cd . .4. ls -ld指令5. ls -i指令1. windows 与linux标识文件之间的区别6. ls -R指令4. cd指令1.cd 指令2. cd ~ 指令3.cd -指令5. 根目录1.绝对路径2.相对路径例判断相对路径是否唯一6. …

leetcode-每日一题-119-杨辉三角2(简单,dp)

今天这道题是一道简单的dp题说实话很好想到解法&#xff0c;就是用两个dp来回倒换即可解除&#xff0c;然后也没啥难度所以就不解释了&#xff0c;养成一个好习惯就是设置数组的时候需要malloc动态获取即可&#xff0c;然后使用memset进行初始化&#xff0c;注意memset只能进行…

期货行权(期货行权日)

​ 期权如何行权&#xff1f;期货到期了如何进行实物交割&#xff1f; 期权到期日 Expiration Date&#xff1a;到期日即是指期权合约所规定的&#xff0c;期权购买者可以实际执行该期权的最后日期。 对欧式期权而言&#xff0c;为期权合约可以行权的唯一一天&#xff1b;对…

[附源码]计算机毕业设计JAVAjsp心理测评系统

[附源码]计算机毕业设计JAVAjsp心理测评系统 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis…

经典图割算法中图的构建及实现:Graph-Cut

经典图割算法中图的:Graph-Cut一&#xff0e;graph-cut&#xff1a;准则函数二&#xff0e;Graph-cut&#xff1a;图的建立1.术语&#xff1a;2.图的建立3. 头文件4. 源文件5. 测试图像讲解目前典型的3种图割算法&#xff1a;graph-cut、grab-but、one-cut。本文主要讲解graph-…

【IEEE2014】EET:基于采样的机器人运动规划中的平衡勘探与开发

EET&#xff1a;基于采样的机器人运动规划中的平衡勘探与开发 摘要&#xff1a; 本文提出了一种用于运动规划的探索/利用树&#xff08;EET&#xff09;算法。EET规划者故意用概率的完整性来换取计算效率。这种权衡使EET规划器能够比最先进的基于采样的规划器多三个数量级。我们…

【蓝桥杯真题练习】STEMA科技素养练习题库 答案版013 持续更新中~

1、人工神经网络是一种模仿动物神经系统设计的机器学习方法,它被用于解决各种传统编程无法解决的问题。“神经网络”一词在英文中是( )。 A.Neural Network B.Neural Engine C.Machine Learning D.Machine Network 答案:A 2、中央处理器(CPU)是手机,电脑…

第五章 Docker 自定义镜像

5-1 认识 Dockerfile 文件 Dockerfile 用于构建 Docker 镜像&#xff0c;Dockerfile 文件是由一行行命令语句组 成 &#xff0c; 基于 这些命 令 即 可以构建一 个镜 像&#xff0c; 比如下面 就 是一 个 Dockefile 文件样例&#xff1a; FROM XXX/jdk:8 MAINTAINER docker_us…

大一学生《Web编程基础》期末网页制作 HTML+CSS+JavaScript 企业网页设计实例

&#x1f389;精彩专栏推荐 &#x1f4ad;文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 &#x1f482; 作者主页: 【主页——&#x1f680;获取更多优质源码】 &#x1f393; web前端期末大作业&#xff1a; 【&#x1f4da;毕设项目精品实战案例 (10…

【紧急情况】:回宿舍放下书包的我,花了20分钟敲了一个抢购脚本

文章目录情况紧急 ⁉️抢❗️抢❗️抢❗️开抢时间说明&#x1f4a8;开抢过程&#x1f4a5;Get_cookie.py开抢结束语&#x1f631;情况紧急 ⁉️ 不管你信不信&#xff0c;这就是俺刚瞧出的代码&#xff01;&#xff01;&#xff01; 现在离20&#xff1a;00还有38分钟&#xf…

持久与速度 鱼和熊掌 MySQL怎么去兼得

前言 我们都知道 MySQL 有一个特性就是持久化储存到磁盘中 我们存进去就要取出来这也是MySQL的速度为什么比不上Redis。但是MySQL 并不是完全就摆烂每次都进行 Select update 的时候都重新去磁盘IO 这样MySQL肯定会更慢 速度快 和 持久化 MySQL 表示我都要 但是两者都要肯定没…

Chapter7.4:线性离散系统的分析与校正考研参考题

此系列属于胡寿松《自动控制原理题海与考研指导》(第三版)习题精选&#xff0c;仅包含部分经典习题&#xff0c;需要完整版习题答案请自行查找&#xff0c;本系列属于知识点巩固部分&#xff0c;搭配如下几个系列进行学习&#xff0c;可用于期末考试和考研复习。 自动控制原理(…

台式万用表究竟如何选型?手持式和台式选择哪一个?

数字万用表是一种多用途的电子测量仪器&#xff0c;有各种各样的形状和规格&#xff0c;可能要超过任何其他仪器品类&#xff0c;比较常见的就是手持和台式万用表了&#xff0c;那么在选型时选择手持式还是台式万用表呢?今天安泰测试就给大家分享一下&#xff1a; 手持式数字万…

充分复用离线空闲算力,降低了实时计算资源开支

针对提供下游数据报表展示的场景&#xff0c;一般需要走预计算的流程将结果持久化下来&#xff0c;对数据就绪和计算耗时的敏感度都较高&#xff0c;而且查询逻辑相对复杂&#xff0c;Trino/Impala 集群规模相对较小&#xff0c;执行容易失败&#xff0c;导致稳定性欠佳。这个场…

Linux系统中标准输入设备的控制实现

大家好&#xff0c;今天主要和大家聊一聊&#xff0c;如何使用标准输入设备&#xff0c;进行控制信息的识别。 目录 第一&#xff1a;按键应用编程方法 第二&#xff1a;单点触摸应用程序实现 ​第三&#xff1a;多点触摸应用程序实现 第一&#xff1a;按键应用编程方法 编写…

java 实现删除单链表中所有指定的结点以及如何清空单链表

文章目录1. 删除单链表中的所有的指定结点1.1 删除思路1.2 删除步骤1.2.1 删除结点不是头结点1.2.2 删除的结点是头结点的情况1.3 部分代码思路分析1.4 整体代码演示2. 清空单链表1. 删除单链表中的所有的指定结点 1.1 删除思路 定义一个 cur 来代替 head 遍历单链表。遇到指…

Python检测和防御DOS攻击

目录 ​编辑 一、在CentOS上安装Python3 1.下载Python3.10源代码文件 2.运行以下命令行完成安装 3.确认是否安装成功 二、理解各个命令的含义 1.uptime 2.netstat 3.ss 4.firewall-cmd 5.sysctl 三、利用Python实现DDOS入侵检测 1.采集TCP连接数据 一、在CentOS上安…

生态系统服务——水源涵养水源涵养分布

水源涵养&#xff0c;是指养护水资源的举措。一般可以通过恢复植被、建设水源涵养区达到控制土壤沙化、降低水土流失的目的。 水源涵养数据是地理遥感生态网平台通过水量平衡方程&#xff08;The Water Balance Equation&#xff09;计算&#xff08;式29&#xff09;。水量平衡…

http://localhost:8080打不开/shutup.bat命令行闪退

前言&#xff1a;学过一阵java web后从头学起&#xff0c;发现http://localhost:8080打不开&#xff0c;双击shutup.bat闪退 http://localhost:8080打不开 一、tomcat 未启动&#xff0c;所以http://localhost:8080打不开&#xff1b; 二、tomcat图标显示已启动&#xff0c;但…