面向切面编程AOP

AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。AOP是Spring框架中的一个重要内容,它通过对既有程序定义一个切入点,然后在其前后切入不同的执行内容,比如常见的有:打开数据库连接/关闭数据库连接、打开事务/关闭事务、记录日志等。基于AOP不会破坏原来程序逻辑,因此它可以很好的对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。这种在运行时,动态地将代码切入到类的指定方法、指定位置上的编程思想就是面向切面的编程。

引入AOP场景starter

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>

AOP实现日志切面

实现AOP的切面主要有以下几个要素:

  • 使用@Aspect注解将一个java类定义为切面类
  • 使用@Pointcut定义一个切入点,可以是一个规则表达式,比如下例中某个package下的所有函数,也可以是一个注解等。
  • 根据需要在切入点不同位置的切入内容
    • 使用@Before在切入点开始处切入内容
    • 使用@After在切入点结尾处切入内容
    • 使用@AfterReturning在切入点return内容之后切入内容(可以用来对处理返回值做一些加工处理)
    • 使用@Around在切入点前后切入内容,并自己控制何时执行切入点自身的内容
    • 使用@AfterThrowing用来处理当切入内容部分抛出异常之后的处理逻辑

AOP概念

  • 连接点(Join point)

    就是spring中允许使用通知的地方,基本上每个方法前后抛异常时都可以是连接点

  • 切点(Poincut)

    其实就是筛选出的连接点,一个类中的所有方法都是连接点,但又不全需要,会筛选出某些作为连接点做为切点。如果说通知定义了切面的动作或者执行时机的话,切点则定义了执行的地点

  • 切面(Aspect)

    其实就是通知和切点的结合,通知和切点共同定义了切面的全部内容,它是干什么的,什么时候在哪执行

  • 引入(Introduction)

    在不改变一个现有类代码的情况下,为该类添加属性和方法,可以在无需修改现有类的前提下,让它们具有新的行为和状态。其实就是把切面(也就是新方法属性:通知定义的)用到目标类中去

  • 目标(target)

    被通知的对象。也就是需要加入额外代码的对象,也就是真正的业务逻辑被组织织入切面。

  • 织入(Weaving)

    把切面加入程序代码的过程。切面在指定的连接点被织入到目标对象中,在目标对象的生命周期里有多个点可以进行织入:

    • 编译期:切面在目标类编译时被织入,这种方式需要特殊的编译器
    • 类加载期:切面在目标类加载到JVM时被织入,这种方式需要特殊的类加载器,它可以在目标类被引入应用之前增强该目标类的字节码
    • 运行期:切面在应用运行的某个时刻被织入,一般情况下,在织入切面时,AOP容器会为目标对象动态创建一个代理对象,Spring AOP就是以这种方式织入切面的。

execution表达式

表达式

访问修饰符 返回值 包名.包名.包名…类名.方法名(参数列表)

例:public void com.huge.service.impl.AccountServiceImpl.save()

全通配写法
*..*.*(..)
切入点表达式写法:

    参数包括:execution("修饰符 返回值类型 包.类.方法名(参数..) throws异常")

    修饰符(举例):一般省略

   *       任意

      public     公共访问

    返回值(举例):

      void      无返回值

      String     返回值是字符串类型

   *       返回值任意

    包(举例):      

      com.xx.user.dao   固定包

      com.xx.*.dao   com.xx下的任意包中的dao包

      com.xx.user.dao..  包括dao下所有子包中

    类(举例):

      UserDaoImpl   具体类

      User*     以User开头类

      *User     以User结尾类

   *       任意类

    方法(举例):

      addUser     具体方法

   *        任意方法

      *User      以add结尾方法

      add*       以add开头方法

    参数(无参):

      ()       无参

      (..)       任意参数

      (String,int)   1个String和1个int类型的参数

      (int)      1个int类型参数

    throws,可省略一般不写

访问修饰符可以省略

void com.huge.service.impl.AccountServiceImpl.save()

返回值可以使用通配符,表示任意返回值

* com.huge.service.impl.AccountServiceImpl.save()

包名可以使用通配符,表示任意包。但是有几级包,就需要写几个*.

* *.*.*.*.AccountServiceImpl.save()

包名可以使用..表示当前包及其子包

* *..AccountServiceImpl.save()

定义在service 包里,及其子类的任意类的任意方法。

* com.huge.service.*.*()

类名和方法名都可以使用*来实现通配

* *..*.*()

指定只有一级包下的service中方法

* *.service..*()

所有包下的service,及其子包

* *..service..*()

IAccountService 若为接口,则为接口中的任意方法及其所有实现类中的任意,方法;若为类,则为该类及其子类中的任意方法。

* com.huge.service.IAccountService+.*()

以s开头的任意方法

* com.huge.service.*.s*()
示例
@Service
public class AOPServiceImpl implements AOPService {
@Override
public void printAOP() {
System.out.println("printAOP");
}
} @RestController
public class AOPController {
@Autowired
AOPService aopService;
@GetMapping("/aop")
public String aopTest(){
aopService.printAOP();
return "func : aopTest";
}
} @Component
@Aspect //切面类注解
@Order(2)
public class AOPTest { @Pointcut("execution(* com.top.springbootweb.service..*(..))")
public void test(){ }
@Before("test()")
public void before(JoinPoint joinPoint){
System.out.println("@Before");
System.out.println("当前方法名: "+joinPoint.getSignature().getName());
} @After("test()")
public void after(JoinPoint joinPoint){
System.out.println("@After");
System.out.println("当前方法名: "+joinPoint.getSignature().getName()); } //环绕通知
@Around("test()")
public void round(ProceedingJoinPoint joinPoint) throws Throwable { //环绕增强必须要获取ProceedingJoinPoint参数,
System.out.println("@Around");
System.out.println("当前方法名: "+joinPoint.getSignature().getName());
} }

Springboot笔记<11>面向切面编程AOP的更多相关文章

  1. Spring学习笔记:面向切面编程AOP(Aspect Oriented Programming)

    一.面向切面编程AOP 目标:让我们可以“专心做事”,避免繁杂重复的功能编码 原理:将复杂的需求分解出不同方面,将公共功能集中解决 *****所谓面向切面编程,是一种通过预编译方式和运行期动态代理实现 ...

  2. Spring框架学习笔记(2)——面向切面编程AOP

    介绍 概念 面向切面编程AOP与面向对象编程OOP有所不同,AOP不是对OOP的替换,而是对OOP的一种补充,AOP增强了OOP. 假设我们有几个业务代码,都调用了某个方法,按照OOP的思想,我们就会 ...

  3. 设计模式之面向切面编程AOP

    动态的将代码切入到指定的方法.指定位置上的编程思想就是面向切面的编程. 代码只有两种,一种是逻辑代码.另一种是非逻辑代码.逻辑代码就是实现功能的核心代码,非逻辑代码就是处理琐碎事务的代码,比如说获取连 ...

  4. Spring学习手札(二)面向切面编程AOP

    AOP理解 Aspect Oriented Program面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术. 但是,这种说法有些片面,因为在软件工程中,AOP的价值体现的并 ...

  5. Spring之控制反转——IoC、面向切面编程——AOP

      控制反转——IoC 提出IoC的目的 为了解决对象之间的耦合度过高的问题,提出了IoC理论,用来实现对象之间的解耦. 什么是IoC IoC是Inversion of Control的缩写,译为控制 ...

  6. 【串线篇】面向切面编程AOP

    面向切面编程AOP 描述:将某段代码“动态”的切入到“指定方法”的“指定位置”进行运行的一种编程方式 (其底层就是Java的动态代理)spring对其做了简化书写 场景: 1).AOP加日志保存到数据 ...

  7. 04 Spring:01.Spring框架简介&&02.程序间耦合&&03.Spring的 IOC 和 DI&&08.面向切面编程 AOP&&10.Spring中事务控制

    spring共四天 第一天:spring框架的概述以及spring中基于XML的IOC配置 第二天:spring中基于注解的IOC和ioc的案例 第三天:spring中的aop和基于XML以及注解的A ...

  8. [译]如何在ASP.NET Core中实现面向切面编程(AOP)

    原文地址:ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE 原文作者:ZANID HAYTAM 译文地址:如何在ASP.NET Cor ...

  9. Spring框架系列(4) - 深入浅出Spring核心之面向切面编程(AOP)

    在Spring基础 - Spring简单例子引入Spring的核心中向你展示了AOP的基础含义,同时以此发散了一些AOP相关知识点; 本节将在此基础上进一步解读AOP的含义以及AOP的使用方式.@pd ...

  10. 面向切面编程AOP

    本文的主要内容(AOP): 1.AOP面向切面编程的相关概念(思想.原理.相关术语) 2.AOP编程底层实现机制(动态代理机制:JDK代理.Cglib代理) 3.Spring的传统AOP编程的案例(计 ...

随机推荐

  1. 地球OL攻略 —— 某应届生求职总结

    某应届生的苦逼求职总结 1.自我介绍,阐述一下自己过去的情况 2.目前的就业情况以及从事的就业方向 3.你在面试的时候遇到什么困难?是怎么帮忙解决的 4.当初为什么会选择选择这一行? 5.分享一下学习 ...

  2. laravel-echo-server 启动报错 [ioredis] Unhandled error event: ReplyError: NOAUTH Authentication required.

    可以在 .env 文件加上以下配置 LARAVEL_ECHO_SERVER_REDIS_HOST= LARAVEL_ECHO_SERVER_REDIS_PASSWORD= LARAVEL_ECHO_S ...

  3. workman PHPSocket.IO文档

    安装 请使用composer集成phpsocket.io. 脚本中引用vendor中的autoload.php实现SocketIO相关类的加载.例如 require_once '/你的vendor路径 ...

  4. 选择排序(简单版)(LOW)

    博客地址:https://www.cnblogs.com/zylyehuo/ # _*_coding:utf-8_*_ def select_sort_simple(li): li_new = [] ...

  5. (踩坑)windows本地部署Dify ,玩转智能体、知识库

      windows 安装docker windows 本地部署deepseek windows 通过docker本地部署dify     一:安装Docker 前提: 开启Hyper-V 打开 控制面 ...

  6. langchain0.3教程:从0到1打造一个智能聊天机器人

    在上一篇文章<大模型开发之langchain0.3(一):入门篇> 中已经介绍了langchain开发框架的搭建,最后使用langchain实现了HelloWorld的代码案例,本篇文章将 ...

  7. 【Maven】POM基本概念

    目前的技术在开发中存在的问题: 一个项目就是一个工程 如果项目非常庞大,就不适合继续使用 package 来划分模块.最好是每一个模块对应一个工程,利于分工协作. 借助于 Maven 就可以将一个项目 ...

  8. 【WinForm】WinForm 生成单文件程序

    WinForm 生成单文件程序 零.解决 安装 Costura.Fody 安装好这个库后生成的就是单文件了. .Net 3.5 NuGet控制台 NuGet\Install-Package Costu ...

  9. ConcurrentHashMap(JDK1.8)put分析

    一.ConcurrentHashMap整体结构 ConcurrentHashMap的数据结构与HashMap差不多,都是Node数组+红黑树+链表:ConcurrentHashMap中table的节点 ...

  10. Sentinel源码—3.ProcessorSlot的执行过程

    大纲 1.NodeSelectorSlot构建资源调用树 2.LogSlot和StatisticSlot采集资源的数据 3.Sentinel监听器模式的规则对象与规则管理 4.AuthoritySlo ...