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

news2024/11/19 20:41:02

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 {

    @Bean
    public UserAspect userAspect() {
        return new UserAspect();
    }

    @Bean
    public 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 {

    @Test
    public 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 {

    @Bean
    public UserAspect userAspect() {
        return new UserAspect();
    }

    @Bean
    public UserService userService() {
        return new UserService();
    }
}

在这里插入图片描述

成功!

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

在这里插入图片描述

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

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

相关文章

【论文精读】NMP: End-to-end Interpretable Neural Motion Planner

toc 1 背景信息 团队&#xff1a;Uber&#xff0c;多伦大大学 年份&#xff1a;2019 论文链接&#xff1a;https://arxiv.org/abs/2101.06679 2 Motivation 深度学习方案受限于累积误差suffers from the compounding error&#xff0c;而且可解释性差interpretability is d…

如何设计一个ToC的弹窗

本文主要分享了如何设计一个具有高可扩展性的弹窗功能。 本设计参考了优惠券功能的设计思路&#xff0c;有兴趣的朋友可以看看优惠券的分享&#xff1a;如何设计一个可扩展的优惠券功能_java优惠券系统设计-CSDN博客 一、需求介绍 假如你的项目需要实现以下弹窗&#xff0c;…

排序算法-合并排序法(MergeSort)

排序算法-合并排序法&#xff08;MergeSort&#xff09; 1、说明 合并排序法&#xff08;MergeSort&#xff09;是针对已排序好的两个或两个以上的数列&#xff08;或数据文件&#xff09;&#xff0c;通过合并的方式将其组合成一个大的且已排好序的数列&#xff08;或数据文…

debian9换源存在的问题

今天租借了云服务器搭建了debian9&#xff0c;给apt-get换源过程中出现了很多问题&#xff0c;主要有两个问题&#xff1a; 问题1&#xff1a; sudo apt-get update 0% [Working]问题2&#xff1a; W: The repository http://mirrors.aliyun.com/debian stretch Release doe…

软考网工选择题易错总结(2020下~2022下)

目录 2020下半年 2021上半年 2021年下半年 2022上半年 2022下半年 2020下半年 15、在卫星通信中&#xff0c;通常采用的差错控制机制为&#xff08;15&#xff09;。 A.停等 ARQ B.后退 N 帧 ARQ C.选择重发 ARQ D.最大限额 ARQ 答案&#xff1…

Golang基础学习笔记

Golang基础学习笔记 1、下载安装 1.1、下载 Golang下载地址&#xff1a;https://golang.google.cn/dl/ 1.2、安装 1.3、环境变量 # GOPATH D:\GolandProjects# GOPROXY https://mirrors.aliyun.com/goproxy# 启用Go模块支持 go env -w GO111MODULEon1.5、验证安装/配置 1.…

Premiere pro

操作 1.音乐淡入淡出 窗口 效果 音频过度 交叉淡化 指数淡化 拖动到首尾音频上2.手机视频序列设置 3.视频转场淡入淡出 选中视频 在视频连接处 交叉溶解

家居行业如何打破获客困局?2023重庆建博会现场,智哪儿AI营销第一课给出了答案

10月12日-14日&#xff0c;2023中国&#xff08;重庆&#xff09;建筑及装饰材料博览会&#xff08;简称&#xff1a;2023中国重庆建博会&#xff09;正在重庆国际博览中心如火如荼地进行。「智哪儿」携手2023中国重庆建博会主办方共同主办的《2023家居行业AI营销第一课&#x…

【quartus13.1/Verilog】swjtu西南交大:计组课程设计

实验目的&#xff1a; 通过学习简单的指令系统及其各指令的操作流程&#xff0c;用 Verilog HDL 语言实 现简单的处理器模块&#xff0c;并通过调用存储器模块&#xff0c;将处理器模块和存储器模块连接形成简 化的计算机核心部件组成的系统。 二. 实验内容 1. 底层用 Verilog…

推荐《金田一少年事件簿》

天树征丸原作&#xff0c;佐藤文也作画的漫画 金田一少年事件簿 播报编辑讨论7上传视频 《金田一少年事件簿》是一部日本推理漫画。早期原作为金成阳三郎&#xff08;后担任剧本&#xff09;&#xff0c;原作为天树征丸&#xff08;前原案&#xff09;&#xff0c;由漫画家佐…

【Python小项目之Tkinter应用】【实用工具】实现手写签名器,可选线条粗细,支持清空、撤销、恢复功能,可将写好的签名保存成图片

文章目录 前言一、实现思路二、关键代码三、完整代码总结同系列项目文章:前言 老规矩,先看效果: 在手写签名窗口中,用户可以选择线条粗细来签名,点击清空按钮可以清空画布,点击撤销按钮可以撤销一笔,点击恢复按钮可以撤销上一步进行的清空或撤销操作,点击保存按钮可以…

java案例RSA分段加密解密,签名验签,公钥加密私钥解密,私钥加密公钥解密,解密乱码怎么解决

一. 原理 非对称加密算法是一种密钥的保密方法。 非对称加密算法需要两个密钥&#xff1a;公开密钥&#xff08;publickey:简称公钥&#xff09;和私有密钥&#xff08;privatekey:简称私钥&#xff09;。公钥与私钥是一对&#xff0c;如果用公钥对数据进行加密&#xff0c;只…

Docker基础操作命令演示

Docker中的常见命令&#xff0c;可以参考官方文档&#xff1a;https://docs.docker.com/engine/reference/commandline/cli/ 1、常见命令介绍 其中&#xff0c;比较常见的命令有&#xff1a; 命令说明文档地址docker pull拉取镜像docker pulldocker push推送镜像到DockerReg…

Googleplay近期大量开发者二次验证问题与解决思路

近期谷歌play更新风控&#xff0c;开发者需要进行二次验证。9月份后大部分的开发者账号不论新老大部分都触发了二次验证风控&#xff0c;笔者目前整理了两个方向的解决方案。 老账号目前解决方案可以通过上传护照、身份证明、驾驶证或者租赁合同、水电费账单、信用卡账单、电话…

了解华为交换机路由器的基本命令

什么是CLI&#xff1a;使用户与设备交互的界面&#xff0c;用户输入对应的命令&#xff0c;设备会回复我们输入的内容&#xff0c;回车车后设备会执行对应命令&#xff0c;达到管理、配置、查看的目的。 CLI界面分为三种操作视图&#xff1a; 用户试图&#xff1a;设备登陆后…

基于阿基米德优化优化的BP神经网络(分类应用) - 附代码

基于阿基米德优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码 文章目录 基于阿基米德优化优化的BP神经网络&#xff08;分类应用&#xff09; - 附代码1.鸢尾花iris数据介绍2.数据集整理3.阿基米德优化优化BP神经网络3.1 BP神经网络参数设置3.2 阿基米德优化算…

Java代码获取当天最晚时间写入数据库自动变为下一天的00:00:00

背景 有个需求要求将用户上传的年/月/日格式时间转为当天最晚时间23:59:59&#xff0c;例如上传2023/10/15&#xff0c;转换为2023/10/15 23:59:59&#xff0c;并将其存入数据库&#xff0c;数据库字段类型为datetime。 部分代码如下&#xff1a; public static Date getEndO…

游戏设计模式专栏(九):用装饰模式定制化游戏元素

点击上方亿元程序员关注和★星标 引言 大家好&#xff0c;我是亿元程序员&#xff0c;一位有着8年游戏行业经验的主程。 本系列是《和8年游戏主程一起学习设计模式》&#xff0c;让糟糕的代码在潜移默化中升华&#xff0c;欢迎大家关注分享收藏订阅。 装饰模式是一种结构性设…

Qt6开发的网络通信工具(支持TCP和UDP)

1. 页面展示 1.2 通信展示 1.2.1 UDP 通信显示 注意&#xff1a;前面的R表示时接收消息&#xff0c;S表示的是发送消息。 1.2.2 TCP通信显示 注&#xff1a;勾选服务器后&#xff0c;出现客户端连接列表&#xff0c;可以群发消息和私发消息。 3. 程序下载 应用程序免费下载&a…

(2022|CVPR,无语言模型,StyleGAN2,CLIP,图文特征对齐)LAFITE:迈向文本到图像生成的无语言训练

LAFITE: Towards Language-Free Training for Text-to-Image Generation 公众号&#xff1a;EDPJ&#xff08;添加 VX&#xff1a;CV_EDPJ 或直接进 Q 交流群&#xff1a;922230617 获取资料&#xff09; 目录 0. 摘要 1. 简介 2. 相关工作 3. LAFITE&#xff1a;一种无…