Spring AOP(概念、实战、原理)

文章目录

      • 1. 什么是AOP
      • 2. AOP体系图
      • 3. 术语解释
        • 3.1 Aspect(切面)
        • 3.2 Join point(连接点)
        • 3.3 Advice(通知)
        • 3.4 Pointcut(切入点)
        • 3.5 Target(目标)
        • 3.6 Proxy(代理)
        • 3.7 Weaving(织入)
      • 4. 如何使用
        • 4.1 常见使用场景
        • 4.2 五种通知
        • 4.3 常见实现方式
          • 4.3.1 注解
      • 5. AOP原理

1. 什么是AOP

能够将那些与业务无关,却为业务模板所共同调成的逻辑或责任(例如事务处理、日志管理、权限控制等)封装起来,便于减少系统的重复代码,降低模块间的耦合度,并有利于未来的拓展性和可维护性

2. AOP体系图

在这里插入图片描述

3. 术语解释

3.1 Aspect(切面)

切入点(Pointcut)+通知(Advice),使用@Aspect注解的类就是切面

3.2 Join point(连接点)

目标对象的所属类中,定义的所有方法均为连接点

3.3 Advice(通知)

增强的逻辑 / 代码,也即拦截到目标对象的连接点之后要做的事情

3.4 Pointcut(切入点)

被切面拦截 / 增强的连接点(切入点一定是连接点,连接点不一定是切入点)

3.5 Target(目标)

被通知的对象

3.6 Proxy(代理)

向目标对象应用通知之后创建的代理对象

3.7 Weaving(织入)

将通知应用到目标对象,进而生成代理对象的过程动作

4. 如何使用

4.1 常见使用场景

● 日志记录:在方法执行前后记录日志,方便跟踪和调试
● 事务管理:在方法执行前后进行事务的开启、提交或回滚
● 安全性控制:在方法执行前进行权限验证,保证敏感数据和操作的安全
● 性能监控:在方法执行前后进行性能监控,如记录方法的执行时间、调用次数等
● 异常处理:在方法执行过程中捕获异常,并进行统一的异常处理和错误日志记录
● 缓存管理:在方法执行前后进行缓存的读取和更新,提高系统的响应速度和性能
● 验证和校验:在方法执行前进行参数的验证和校验,确保输入的数据符合要求

4.2 五种通知

● 前置通知:在目标方法执行之前执行执行的通知。
● 环绕通知:在目标方法执行之前和之后都可以执行额外代码的通知。
● 后置通知:在目标方法执行之后执行的通知。
● 异常通知:在目标方法抛出异常时执行的通知。
● 返回通知:在目标方法返回后调用

4.3 常见实现方式
4.3.1 注解

创建Spring boot项目,引入依赖

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

示例一:在调用get方法之前,输出”aop触发“
创建AOP切面类,加@Aspect注解代表这是一个切面

package com.bin.bintest.Config;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Aspect
@Component
public class binAdvice {@Pointcut("@annotation(org.springframework.web.bind.annotation.GetMapping)")private void logAdvicePointcut() {}// 前置通知@Before("logAdvicePointcut()")public void binAdvice() {System.out.println("aop触发");}/*** @Before:前置通知* @After:后置通知* @AfterReturning:返回通知* @AfterThrowing:异常通知* @Around:环绕通知*/}

创建controller

package com.bin.bintest.Controller;import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;@RestController
public class userController {@GetMapping("/name")public void getUsername() {System.out.println("获取名字");}}

发起请求,结果为
在这里插入图片描述

示例二:自定义注解AOP
当你在编写自定义注解时,@Target、@Retention、@Documented 和 @Inherited 是四个你可能会用到的元注解,它们可以帮助你更好地定义和使用注解。

@Target
@Target 注解用于指定注解可以应用的程序元素类型。它的值是一个 ElementType 数组,表示该注解可以应用到哪些地方,包括类、接口、方法、字段等。常用的 ElementType 类型包括:

ElementType.TYPE:类、接口、枚举
ElementType.METHOD:方法
ElementType.FIELD:字段
ElementType.PARAMETER:方法参数
ElementType.CONSTRUCTOR:构造方法
ElementType.LOCAL_VARIABLE:局部变量
ElementType.ANNOTATION_TYPE:注解类型
ElementType.PACKAGE:包

@Retention
@Retention 注解用于指定注解的保留策略,即注解在编译时、运行时或者在类文件中都保留。它的值是一个 RetentionPolicy 枚举,包括:

RetentionPolicy.SOURCE:注解仅保留在源代码中,在编译时丢弃
RetentionPolicy.CLASS:注解保留到类文件中,在运行时丢弃(默认值)
RetentionPolicy.RUNTIME:注解保留到运行时,可以通过反射获取

@Documented
@Documented 注解表示该注解应该被 javadoc 工具记录,因此可以在生成的文档中看到该注解及其说明。它没有任何属性,只需将其放在注解声明之前即可。

@Inherited
@Inherited 注解表示该注解可以被子类继承。当一个类使用了被 @Inherited 注解的注解时,其子类也会继承该注解。需要注意的是,@Inherited 只对类的继承有效,对接口、方法、字段等不起作用。

创建自定义注解

package com.bin.bintest.Config;import java.lang.annotation.*;@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface MyAnnotation {}

创建service

package com.bin.bintest.service;import com.bin.bintest.Config.MyAnnotation;
import org.springframework.stereotype.Service;@Service
public class UserService {@MyAnnotationpublic void getUsername() {System.out.println("你的名字");}}

创建测试

package com.bin.bintest;import com.bin.bintest.service.UserService;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;@SpringBootTest
class BintestApplicationTests {@AutowiredUserService userService;@Testvoid contextLoads() {userService.getUsername();}}

运行结果:
在这里插入图片描述

5. AOP原理

Spring AOP(Aspect Oriented Programming,面向切面编程)主要使用两种动态代理机制来实现AOP的织入(weaving):

  1. JDK动态代理 (Java Dynamic Proxy):当被代理的对象实现了接口时,Spring AOP会使用JDK动态代理来创建代理对象。JDK动态代理是通过java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口实现的。
  2. CGLIB代理 (Code Generation Library):当被代理的对象没有实现任何接口时,Spring AOP会使用CGLIB来创建代理。CGLIB是一个高性能的代码生成库,它通过字节码技术为一个类创建子类,并对子类进行增强。
    在Spring框架中,默认情况下,如果目标对象实现了至少一个接口,那么Spring将使用JDK动态代理;如果没有实现任何接口,则会使用CGLIB代理。当然,也可以通过配置来指定使用哪种代理方式。

本文章借鉴:
SPRINGBOOT-自定义注解AOP实现及拦截器示例
Spring AOP代码实现:实例演示与注解全解

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

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

相关文章

文本解码原理--MindNLP

前言 根据前文预测下一个单词 一个文本序列的概率分布可以分解为每个词基于其上文的条件概率的乘积 Greedy search 在每个时间步&#x1d461;都简单地选择概率最高的词作为当前输出词: &#x1d464;&#x1d461;&#x1d44e;&#x1d45f;&#x1d454;&#x1d45a;&am…

【泛微E9】统一待办中心集成

1、什么是统一待办中心集成 概述&#xff1a;目前有很多第3方系统都有流程&#xff0c;操作人都会有待办事宜、已办事宜。但这些待办流程都分散在不同系统中&#xff0c;用户操作不方便&#xff0c;对相应流程也无法及时处理。客户希望能在泛微OA中对所有的第3方流程做统一展示…

LlamaIndex:向 LLM 添加个人数据

LlamaIndex 是您构建基于 LLM 的应用程序的友好数据助手。您可以使用自然语言轻松地获取、管理和检索私有数据和特定领域的数据。 LlamaIndex 是一个针对大型语言模型 (LLM) 应用程序的数据框架。GPT-4 等 LLM 在海量的公共数据集上进行预训练&#xff0c;开箱即用即可实现令人…

【.NET 6 实战--孢子记账--从单体到微服务】--开发环境设置

在这一小节&#xff0c;我们将设置开发环境。 一、安装SDK 咱们的项目使用的是 .NET6&#xff0c;开发前我们需要从官网上下载.NET6 SDK&#xff08;点击下载&#xff09;&#xff0c;这里要注意的是我们需要下载.NET6 SDK&#xff0c;而不是 .NET6 Runtiem 。SDK 包含 Runti…

PyCharm 常用 的插件

Material Theme UI Lite&#xff1a;‌提供多种不同的页面风格&#xff0c;‌为PyCharm界面增添个性化元素。‌Chinese (Simplified) Language Pack&#xff1a;‌为中文用户提供简体中文的界面、‌菜单、‌提示信息&#xff0c;‌提升使用体验。‌Tabnine&#xff1a;‌基于人…

C# 开发监控方法执行耗时

MethodTimer.Fody 是一个功能强大的库,可以用于测量 .NET 应用程序中的方法的执行时间。允许你在不修改代码的情况下,自动地测量和记录方法的执行时间。 这个工具是基于.NET的 weaving 技术,通过修改IL(Intermediate Language,中间语言)代码来插入计时逻辑,从而在方法调…

Mac应用快速启动器:Alfred 5 for Mac 激活版

Alfred 5 是一款专为 macOS 系统设计的效率提升工具。这款软件以其快速启动和高效操作功能著称&#xff0c;通过使用快捷键来呼出输入界面&#xff0c;用户可以快速完成各种任务。 最新版本 Alfred 5.5 引入了一些新功能。其中包括整合了 ChatGPT 和 DALL-E&#xff0c;这意味…

ROS2入门到精通—— 2-13 ROS2实战:实现机器人多目标点导航(附ROS C++代码以及脚本实现)

0 前言 实现机器人多目标点导航是非常常见的需求,本文将介绍ROS2和Shell脚本两个方法实现多目标点导航,读者可以根据需求对接仿真和实车。 1 yaml-cpp介绍 YAML是专门用来写配置文件的语言,实质上是一种通用的数据串行化格式 1.1 yaml-cpp安装 git clone https://github…

kail-linux如何使用NAT连接修改静态IP

1、Contos修改静态IP vi /etc/sysconfig/network-scripts/ifcfg-ens33&#xff0c; 标记红色处可能序号会变动 参考linux配置网络不通解决方案_kylinv10sp2 网关不通-CSDN博客https://tanrt06.blog.csdn.net/article/details/132430485?spm1001.2014.3001.5502 Kail时候NAT连…

Java SE 文件上传和文件下载的底层原理

1. Java SE 文件上传和文件下载的底层原理 文章目录 1. Java SE 文件上传和文件下载的底层原理2. 文件上传2.1 文件上传应用实例2.2 文件上传注意事项和细节 3. 文件下载3.1 文件下载应用实例3.2 文件下载注意事项和细节 4. 总结&#xff1a;5. 最后: 2. 文件上传 文件的上传和…

ElasticSearch(三)—文档字段参数设置以及元字段

一、 字段参数设置 analyzer&#xff1a; 指定分词器。elasticsearch 是一款支持全文检索的分布式存储系统&#xff0c;对于 text类型的字段&#xff0c;首先会使用分词器进行分词&#xff0c;然后将分词后的词根一个一个存储在倒排索引中&#xff0c;后续查询主要是针对词根…

模拟实现c++中的vector模版

目录 一vector简述&#xff1a; 二vector的一些接口函数&#xff1a; 1初始化&#xff1a; 2.vector增长&#xff1a; 3vector增删查改&#xff1a; 三vector模拟实现部分主要函数&#xff1a; 1.size,capacity,empty,clear接口&#xff1a; 2.reverse的实现&#xff1…

springboot招生宣传管理系统论文源码调试讲解

2 相关技术 2.1 VUE介绍 Vue (读音 /vjuː/&#xff0c;类似于 view) 是一套用于构建用户界面的渐进式框架。与其它大型框架不同的是&#xff0c;Vue 被设计为可以自底向上逐层应用。Vue 的核心库只关注视图层&#xff0c;不仅易于上手&#xff0c;还便于与第三方库或既有项目…

Github 2024-07-27开源项目日报 Top10

根据Github Trendings的统计,今日(2024-07-27统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量非开发语言项目2C++项目2C项目2TypeScript项目1JavaScript项目1Java项目1Python项目1C#项目1免费编程学习平台:freeCodeCamp.org 创建周期:33…

SpringBoot入门实战:SpringBoot整合Shiro

1.背景介绍 SpringBoot是一个用于快速开发Spring应用程序的框架。它的核心是对Spring框架的一层封装&#xff0c;使其更加简单易用。SpringBoot整合Shiro是一种将SpringBoot与Shiro整合的方法&#xff0c;以实现身份验证和授权功能。 Shiro是一个强大的Java安全框架&#xff0c…

电影院售票网站

你好呀&#xff0c;我是计算机学姐码农小野&#xff01;如果有相关需求&#xff0c;可以私信联系我。 开发语言&#xff1a;Java 数据库&#xff1a;MySQL 技术&#xff1a;SSM框架 工具&#xff1a;IDEA/Eclipse、Navicat、Maven 系统展示 首页 用户管理界面 正在上映管…

正则表达式 先行/后发断言

参考资料 正则表达式的先行断言(lookahead)和后行断言(lookbehind)正则表达式中分组功能高级用法前瞻断言与后瞻断言初心者歓迎&#xff01;手と目で覚える正規表現入門・その&#xff14;&#xff08;最終回&#xff09;「中級者テクニックをマスターしよう」 目录 一. Posit…

AmyloidPETNet:使用端到端深度学习对脑PET成像中的淀粉样阳性进行分类| 文献速递-AI辅助的放射影像疾病诊断

Title 题目 AmyloidPETNet: Classification of Amyloid Positivity in Brain PET Imaging Using End-to-End Deep Learning AmyloidPETNet&#xff1a;使用端到端深度学习对脑PET成像中的淀粉样阳性进行分类 01 文献速递介绍 阿尔茨海默病 (AD) 的一个病理异常是脑内淀粉样…

JavaScript——常用库

文章目录 绪论jQuery选择器事件修改 css查找ajax setTimeout与setIntervalsetTimeoutsetInterval requestAnimationFrameMap与SetlocalStorageJSONDateWebSocketwindowcanvas结语 绪论 『时间是伟大的作家&#xff0c;总会写下完美的结局。』—— 「秋之回忆」 jQuery 这个是优…

AI绘画:艺术与科技融合的新篇章

随着人工智能&#xff08;AI&#xff09;技术的飞速发展&#xff0c;AI绘画作为一种新兴的艺术形式&#xff0c;正逐步改变着传统艺术创作的格局。从早期的简单模仿到如今的个性化创作&#xff0c;AI绘画不仅提升了艺术创作的效率和质量&#xff0c;还开辟了全新的应用场景和商…