SpringAOP是什么?为什么要有SpringAOP?

SpringAOP是什么?为什么要有SpringAOP?

原文:SpringAOP是什么?为什么要有SpringAOP?

一、有SpringAOP之前

简单的开发场景,只需要写简单的业务逻辑,比如CRUD

但是在执行具体的逻辑之前,需要进行权限校验,或者在具体的逻辑之后,需要日志记录呢?

这样就增加了很多代码,而且增加的这些代码都是差不多的

既然如此,那我们抽出来吧!在这个类里面写一个私有的方法。

代码少了很多,但是如果其他的类也需要用到权限校验和日志记录呢?

难道也要在其他类里面写私有方法吗?这也太麻烦了。

为了解决这个问题,有两种方法。

第一种:将这个私有方法抽出来不就好了,我直接写两个工具类,一个是权限校验,一个是日志记录,谁用谁调用。

第二种:我直接搞一个父类,谁用我就让它继承这个父类,这样就能直接调用父类的方法。

但是不论是第一种还是第二种其实都会侵入业务类的方法逻辑,那么有没有一种方法,能在没有对业务核心代码侵入性的前提下,给业务核心代码添加额外的功能呢?

这时候AOP就出来了,也就是所谓的面向切面编程。

首先来看一下AOP的概念:

切入点:

想额外添加功能的方法

切面:

权限检查、日志记录等这些增强逻辑的方法在的类

通知:

在目标方法运行的什么时机来执行某个增强逻辑

目标方法前还是目标方法后

切入点表达式:

规定增强逻辑需要去增强什么方法

二、有SpringAOP之后

使用方法:

maven依赖

<dependencies><!--导入Spring Context核心依赖--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.3.23</version></dependency><!--Spring AOP--><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.3.1</version></dependency><!--Lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.30</version></dependency><!--Junit单元测试--><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.13.2</version><scope>test</scope></dependency></dependencies>

切入点

package com.moon.aop.bean;/*** @Author moon* @Date 2023/10/15 15:55* @Description 切入点*/
public class UserService {public void addUser() {System.out.println("添加用户...");}public void queryUser() {System.out.println("查询用户...");}public void editUser() {System.out.println("编辑用户...");}public void deleteUser() {System.out.println("删除用户...");}
}

切面

package com.moon.aop.bean;/*
* 底层依赖Aspect的注解【但是原理不同】
* */
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;/*** @Author moon* @Date 2023/10/15 15:58* @Description 切面,里面放的增强逻辑*/@Aspect
public class UserAspect {/** 这就是传说中上文所谓的切入点表达式* */@Pointcut(value = "execution(* com.moon.aop.bean.UserService.*(..))")public void point() {}/** 这就是增强逻辑* @Before、@After就是所谓的通知* */@Before(value = "point()")public void beforeRun() {System.out.println("在目标方法执行前开始执行");}@After(value = "point()")public void afterRun() {System.out.println("在目标方法执行后开始执行");}
}

配置类:用来初始化和加载Spring的IOC容器

package com.moon.aop.bean;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;/*** @Author moon* @Date 2023/10/15 16:07* @Description 用该类来初始化和加载IOC容器*/@Configuration
public class SpringConfig {@Beanpublic UserAspect userAspect() {return new UserAspect();}@Beanpublic UserService userService() {return new UserService();}
}

Junit单元测试

import com.moon.aop.bean.SpringConfig;
import com.moon.aop.bean.UserService;
import org.junit.Test;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;/*** @Author moon* @Date 2023/10/15 16:32* @Description*/
public class AOPTest {@Testpublic void test01() {/** 通过配置类初始化IOC容器* */AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(SpringConfig.class);/** 获取目标对象,Bean* */UserService userService = context.getBean(UserService.class);userService.addUser();}
}

在这里插入图片描述

AOP并没有生效

此时userService.getClass().getName()的值为

在这里插入图片描述

那是因为Spring并没有开启AOP,需要我们手动开启

package com.moon.aop.bean;import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;/*** @Author moon* @Date 2023/10/15 16:07* @Description 用该类来初始化和加载IOC容器*/@Configuration
/*
* 手动开启AOP功能
* */
@EnableAspectJAutoProxy
public class SpringConfig {@Beanpublic UserAspect userAspect() {return new UserAspect();}@Beanpublic UserService userService() {return new UserService();}
}

在这里插入图片描述

成功!

此时userService.getClass().getName()的值为

在这里插入图片描述

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

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

相关文章

Golang安装和配置指南:从零开始的高效开发之旅

Golang&#xff08;又称Go&#xff09;是一种快速、可靠且高效的编程语言&#xff0c;由Google开发并在开源社区广泛应用。Golang的设计目标是通过简洁的语法和强大的并发模型提供高效的开发体验。在本文中&#xff0c;我们将指导您如何安装和配置Golang&#xff0c;以便开始您…

Python中兔子递归函数的例子

本文将详细介绍Python中兔子递归函数的例子&#xff0c;展示递归函数的基本实现方法及其原理。 一、递归函数的概念 递归函数是指在函数内部调用自身的函数。通过递归函数&#xff0c;可以将复杂问题分解成简单的子问题来解决。 这种过程是有限的&#xff0c;当子问题足够小…

【大数据Hive】hive select 语法使用详解

目录 一、前言 二、Hive select 完整语法树 三、Hive select 操作演示 3.1 数据准备 3.1.1 创建一张表 3.1.2 将数据load加载到t_usa_covid19表 3.1.3 再创建一张分区表 3.1.4 使用动态分区插入数据 3.2 select 常用语法 3.2.1 查询所有字段或者指定字段 3.2.2 查询…

kafka安装和使用的入门教程

这篇文章简单介绍如何在ubuntu上安装kafka&#xff0c;并使用kafka完成消息的发送和接收。 一、安装kafka 访问kafka官网Apache Kafka&#xff0c;然后点击快速开始 紧接着&#xff0c;点击Download 最后点击下载链接下载安装包 如果下载缓慢&#xff0c;博主已经把安装包上传…

使用匿名函数在Golang中的好处

发挥Golang中无名代码块的潜力 匿名函数&#xff0c;也被称为lambda函数或闭包&#xff0c;是Golang中的一个强大功能&#xff0c;提供了许多好处。这些无名代码块为开发人员在设计和构建其代码时提供了更大的灵活性和模块化。在本节中&#xff0c;我们将探讨使用匿名函数可以…

《Python基础教程》专栏总结篇

大家好&#xff0c;我是爱编程的喵喵。双985硕士毕业&#xff0c;现担任全栈工程师一职&#xff0c;热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。…

【Java基础面试一】、为什么Java代码可以实现一次编写、到处运行?

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 面试官&#xff1a;为什么Java代码可以实现…

国外的跨境物流有什么学习的地方

国外的跨境物流的学习点可以从以下几个方面入手&#xff1a; 跨境物流的技术与流程&#xff1a;学习国外跨境物流的技术和流程&#xff0c;了解国外先进的物流设备和仓储管理系统。 国际贸易政策和法规&#xff1a;熟悉国际贸易政策和法规&#xff0c;包括出口清关流程、运输协…

python - 内存池的机制

内存池是一中用于管理内存分配的机制&#xff0c;它可以提高内存分配和释放的小路&#xff0c;内存池通常由一块预先分配好的内存区域和一个空闲列表组成&#xff0c;当需要内存分配内存时&#xff0c;内存会重空闲列表中取出来医疗空闲的内存&#xff0c;当释放内存时&#xf…

头部品牌集体扑街!2023年9月京东平板电视TOP10品牌排行榜出炉

鲸参谋监测的京东平台9月份平板电视市场最新销售数据已出炉&#xff01; 根据鲸参谋平台的数据显示&#xff0c;9月份&#xff0c;京东平台大家电品类——平板电视的整体销售呈现下滑。具体地&#xff0c;9月平板电视的销量为62万&#xff0c;环比降低约18%&#xff0c;同比降低…

oracle 同一张表同时insert多条数据 mysql 同一张表同时insert多条数据

oracle 同一张表同时insert多条数据 在Oracle数据库中&#xff0c;你可以使用INSERT ALL语句同时向同一张表插入多条数据。INSERT ALL语句允许你一次执行多个插入操作&#xff0c;可以提高插入的效率和速度。 以下是使用INSERT ALL语句插入多条数据的示例&#xff1a; INSERT…

线程安全问题 的小案例

package Thread_api_test;public class ThreadSafety {//模拟线程安全问题public static void main(String[] args) {//1:创建一个账户对象 代表两个人的共享账户Account accnew Account("ICBC",10000);//创建两个线程 分别两个人 再去同一个账户里取钱10000new Draw…

【Python机器学习】零基础掌握HDBSCAN聚类

如何在大量数据中识别出有用的模式或群体? 在我们日常生活和工作中,数据无处不在。但,在大量数据中找到有用的信息却并非易事。特别是对于那些不具备数据科学背景的人来说,这一任务更加艰巨。那么有没有一种方法,不仅高效还易于理解,能帮助我们从复杂的数据中提取有用的…

细说晶振元件HC49U的功能、应用及性能特点 | 百能云芯

在电子领域&#xff0c;晶振&#xff08;Crystal Oscillator&#xff09;是一种重要的元件&#xff0c;用于产生稳定的时钟信号。HC49U是一种常见的晶振型号&#xff0c;具有广泛的应用范围。云芯将带您深入探讨HC49U晶振的功能、应用领域&#xff0c;以及其性能特点&#xff0…

postman接口测试

HTTP的接口测试工具有很多&#xff0c;可以进行http请求的方式也有很多&#xff0c;但是可以直接拿来就用&#xff0c;而且功能还支持的不错的&#xff0c;我使用过的来讲&#xff0c;还是postman比较上手。 优点&#xff1a; 1、支持用例管理 2、支持get、post、文件上传、响…

安捷伦N8974A分析仪

安捷伦N8974A分析仪 N8974A 是 Agilent 的二手分析仪。分析仪是测试工程、医疗、汽车和技术行业电子设备的关键工具。使用分析仪来监控许多不同类型的电子设备的性能。您可能需要分析仪来测量音频频谱、电压和电流、信号和频率等分量 频率范围&#xff1a;10 MHz 至 6.7 GHz 一…

MTC证书|欧盟与英国金属类产品清关新要求

英国禁止进口俄钢材的通告内容 从2023年 9 月 30 日起&#xff0c;欧盟和英国将对在第三国加工的特定钢铁产品实施新的制裁&#xff0c;这些产品包含俄罗斯原产的钢铁原料。进口商需要在进口时申报进口货物是否合规。 MTC认证 欧盟严抓MTC认证 获悉&#xff0c;从10月1日起&a…

浅谈大数据之Flink

1.3.4 Flink Flink是由德国3所大学发起的学术项目,后来不断发展壮大,并于2014年年末成为Apache顶级项目之一。在德语中,“flink”表示快速、敏捷,以此来表征这款计算框架的特点。 Flink主要面向流处理,如果说Spark是批处理界的“王者”,那么Flink就是流处理领域冉冉升…

本地PHP搭建简单Imagewheel私人云图床,在外远程访问

&#x1f525;博客主页&#xff1a; 小羊失眠啦 &#x1f516;系列专栏&#xff1a; C语言、Linux &#x1f325;️每日语录&#xff1a;追逐影子的人&#xff0c;自己就是影子。 ❤️感谢大家点赞&#x1f44d;收藏⭐评论✍️ 1.前言 云存储在前几年风头无两&#xff0c;云存…

Linux下企业级夜莺监控分析工具的远程访问设置【内网穿透】

文章目录 前言1. Linux 部署Nightingale2. 本地访问测试3. Linux 安装cpolar4. 配置Nightingale公网访问地址5. 公网远程访问Nightingale管理界面6. 固定Nightingale公网地址 前言 夜莺监控是一款开源云原生观测分析工具&#xff0c;采用 All-in-One 的设计理念&#xff0c;集…