java中aop基础理论

2024-09-02 13:48
文章标签 java aop 基础理论

本文主要是介绍java中aop基础理论,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

AOP编程原理

什么是AOP:

AOP 是软件设计领域中的面向切面编程,它是面向对象编程(OOP)的一种补充和完善实际项目中我们通常将面向对象理解为一个静态过程(例如一个系统有多少个模块,一个模块有哪些对象,对象有哪些属性),面向切面中包含一个一个动态过程(在对象运行时动态织入一些功能。)

AOP的应用:

实际项目中通常会将系统分为两大部分:核心关注点和非核心关注点

编程过程中首先要完成的是什么?核心关注点(核心业务)
非核心关注点如何切入到系统中?硬编码(违背OCP),AOP(推荐)

AOP就是要在基于OCP(开闭原则)在不改变原有系统核心业务代码的基础上动态添加一些扩展功能并可以"控制"对象的执行(例如权限控制)。

AOP实际项目应用场景

AOP 通常应用于日志的处理,事务处理,权限处理,缓存处理等等。

AOP底层基于代理机制实现功能扩展

在这里插入图片描述

说明:

Spring boot2.x 中AOP现在默认使用的CGLIB代理,假如需要使用JDK动态代理可以在配置文件(applicatiion.properties)中进行如下配置:

spring.aop.proxy-target-class=false

AOP 相关术语

  1. 切面(aspect): 横切面对象,一般为一个具体类对象(可以借助@Aspect声明)
  2. 连接点(joinpoint):程序执行过程中某个特定的点,一般指被拦截到的的方法
  3. 切入点(pointcut):对连接点拦截内容的一种定义,一般可以理解为多个连接点的结合.
  4. 通知(Advice):在切面的某个特定连接点上执行的动作(扩展功能),例如around,before,after等

AOP 基本步骤

1.添加依赖

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

2.创建日志切面处理类

将此日志处理类作为核心业务增强(一个横切面对象)类,用于输出业务开始执行时间,以及业务结束执行时间。
横切面对象主要由两部分构成:
1)切入点(用于@Pointcut标识)
2)功能增强(用通知@Before,@After等进行标识)

@Aspect
@Service
@Slf4j
public class SysLogAspect {/*** @Pointcut注解用于定义切入点* bean表达式为切入点表达式,* bean表达式内部指定的bean对象中*   所有方法为切入点(进行功能扩展的点)*/@Pointcut("bean(sysUserServiceImpl)")public void logPointCut() {}/*** @Around 描述的方法为环绕通知,用于功能增强*   环绕通知(目标方法执行之前和之后都可以执行)* @param jp 连接点 (封装了要执行的目标方法信息 )//此对象仅用于around* @return 目标方法的执行结果* @throws Throwable*/@Around("logPointCut()")public Object around(ProceedingJoinPoint jp)throws Throwable{try {log.info("start:"+System.currentTimeMillis());Object result=jp.proceed();//调用下一个切面方法或目标方法log.info("after:"+System.currentTimeMillis());return result;}catch(Throwable e) {log.error(e.getMessage());throw e;}}
}

说明

其中:
@Aspect 注解用于标识此类为一个AOP横切面对象
@Pointcut 注解用于定义本类中的切入点,本案例中切入点表达式用的是bean表达式,这个表达式以bean开头,bean括号中的内容为一个spring管理的某个bean对象的id。
@Around用于定义一个环绕通知(满足切入点表达式的核心业务方法执行之前和之后执行的一个操作)

术语增强:
切面:用于封装扩展业务的一个类的对象。
通知:切面扩展业务中的一个操作(方法)。

JDK与CGLIB原理分析

在这里插入图片描述

基于CGLIB动态代理实现AOP

在这里插入图片描述

区别分析

基于CGLIB实现的代理类是service实现类的子类,基于JDK实现的代理类实现了service接口,与service实现类属于兄弟关系(组合实现)

五种类型

在AOP编程中有五种类型的通知:
1)前置通知 (@Before) 方法执行之前执行
2)返回通知 (@AfterReturning) 方法return之后执行
3)异常通知 (@AfterThrowing) 方法出现异常之后执行
4)后置通知 (@After) : 又称之为最终通知(finally)
环绕通知 (@Around) :重点掌握
在这里插入图片描述

@order(1)//为切片配置优先级,数字越小优先级越高

切入点表达式

Spring中通过切入点表达式定义具体切入点,其常用AOP切入点表达式定义及

指示符作用
bean用于匹配指定bean id的的方法执行
within用于匹配指定包名下类型内的方法执行
execution用于进行细粒度方法匹配执行具体业务
@annotation用于匹配指定注解修饰的方法执行

1.bean表达式应用

bean(“userServiceImpl”))指定一个类中所有方法
bean("*ServiceImpl")指定所有的后缀为serviceImpl的类

说明:bean表达式内部的对象是由spring容器管理的一个bean对象,表达式内部的内部的名字应该时spring容器中某个bean的key.

2.Within表达式应用

within表达式应用于类级别,实现粗粒度的切入点表达式定义:

within(“aop.service.UserServiceImpl”)指定类,只能指定一个类
within(“aop.service.*”)只包括当前目录下的类
within(“aop.service…*”)指定当前目录包含所有子目录中的类

3.Execution表达式应用

execution表达式应用于方法级别,细粒度的切入点表达式定义

execution(void aop.service.UserServiceImpl.addUser())匹配方法
execution(void aop.service.PersonServiceImpl.addUser(String))方法参数必须为字符串
execution(* aop.service….(…))万能配置

4.@annotation表达式应用

@annotaion表达式应用于方法级别,实现细粒度的切入点表达式定义

@annotation(com.jt.common.anno.RequestLog)指定一个需要实现增强功能的方法

其中:RequestLog为我们自己定义的注解,当我们使用@RequestLog注解修饰业务层方法时,系统底层会在执行此方法时进行扩展操作.

这篇关于java中aop基础理论的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130125

相关文章

Java中流式并行操作parallelStream的原理和使用方法

《Java中流式并行操作parallelStream的原理和使用方法》本文详细介绍了Java中的并行流(parallelStream)的原理、正确使用方法以及在实际业务中的应用案例,并指出在使用并行流... 目录Java中流式并行操作parallelStream0. 问题的产生1. 什么是parallelS

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

SpringBoot基于注解实现数据库字段回填的完整方案

《SpringBoot基于注解实现数据库字段回填的完整方案》这篇文章主要为大家详细介绍了SpringBoot如何基于注解实现数据库字段回填的相关方法,文中的示例代码讲解详细,感兴趣的小伙伴可以了解... 目录数据库表pom.XMLRelationFieldRelationFieldMapping基础的一些代

一篇文章彻底搞懂macOS如何决定java环境

《一篇文章彻底搞懂macOS如何决定java环境》MacOS作为一个功能强大的操作系统,为开发者提供了丰富的开发工具和框架,下面:本文主要介绍macOS如何决定java环境的相关资料,文中通过代码... 目录方法一:使用 which命令方法二:使用 Java_home工具(Apple 官方推荐)那问题来了,

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java AOP面向切面编程的概念和实现方式

《JavaAOP面向切面编程的概念和实现方式》AOP是面向切面编程,通过动态代理将横切关注点(如日志、事务)与核心业务逻辑分离,提升代码复用性和可维护性,本文给大家介绍JavaAOP面向切面编程的概... 目录一、AOP 是什么?二、AOP 的核心概念与实现方式核心概念实现方式三、Spring AOP 的关

详解SpringBoot+Ehcache使用示例

《详解SpringBoot+Ehcache使用示例》本文介绍了SpringBoot中配置Ehcache、自定义get/set方式,并实际使用缓存的过程,文中通过示例代码介绍的非常详细,对大家的学习或者... 目录摘要概念内存与磁盘持久化存储:配置灵活性:编码示例引入依赖:配置ehcache.XML文件:配置

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Java中的.close()举例详解

《Java中的.close()举例详解》.close()方法只适用于通过window.open()打开的弹出窗口,对于浏览器的主窗口,如果没有得到用户允许是不能关闭的,:本文主要介绍Java中的.... 目录当你遇到以下三种情况时,一定要记得使用 .close():用法作用举例如何判断代码中的 input

Spring Gateway动态路由实现方案

《SpringGateway动态路由实现方案》本文主要介绍了SpringGateway动态路由实现方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随... 目录前沿何为路由RouteDefinitionRouteLocator工作流程动态路由实现尾巴前沿S