AOP 面向切片编程

news2024/9/20 18:43:30

目录

1. 什么是AOP

2. AOP的应用场景

3. AOP在Java中的实现

4. Spring AOP概述

5. Spring AOP的配置

1.在pom.xml文件中添加Spring AOP的依赖:

2. 定义切面

3. 启用AOP

4. 目标类

5. 测试AOP

6. AOP与其他技术的对比

面向切面编程(AOP, Aspect-Oriented Programming)是一种编程范式,旨在通过分离横切关注点来提高代码的模块化。AOP的核心思想是将那些跨越多个模块的通用行为(如日志记录、事务管理、安全检查等)从业务逻辑代码中分离出来,以提高代码的可维护性和可重用性。本文将详细介绍Java中的AOP概念,并通过代码示例展示如何在实际项目中应用AOP。

1. 什么是AOP

AOP是一种编程技术,用于在应用程序中动态地将代码切片(如日志、事务等)插入到特定位置。AOP的核心概念包括:

切面(Aspect):切面是模块化的关注点,通常是横切关注点,如日志记录、事务管理等。
连接点(Join Point):连接点是在程序执行过程中某个特定的点,如方法调用或异常抛出。
通知(Advice):通知是切面在连接点上执行的代码。
切入点(Pointcut):切入点是一个表达式,用于匹配连接点。
引入(Introduction):引入允许在不修改现有类的情况下向现有类添加新方法或属性。
织入(Weaving):织入是将切面应用到目标对象并创建代理对象的过程。


2. AOP的应用场景

AOP非常适用于处理那些横切关注点,即那些在多个模块中重复出现代码逻辑。典型的应用场景包括:

日志记录:在方法调用之前和之后记录日志。
事务管理:在方法调用开始前开启事务,方法调用结束后提交事务,方法调用异常时回滚事务。
安全检查:在方法调用前进行权限验证。
性能监控:监控方法的执行时间。


3. AOP在Java中的实现

在Java中,实现AOP的常用框架有AspectJSpring AOP。本文主要介绍Spring AOP的实现。

4. Spring AOP概述

Spring AOP是Spring框架中的一个模块,提供了对AOP的支持。Spring AOP基于代理模式,通过在运行时生成代理对象来实现AOP功能。Spring AOP支持以下类型的通知:

前置通知(Before Advice):在目标方法执行之前执行。
后置通知(After Advice):在目标方法执行之后执行。
返回通知(After Returning Advice):在目标方法成功返回之后执行。
异常通知(After Throwing Advice):在目标方法抛出异常之后执行。
环绕通知(Around Advice):包裹目标方法的执行,在目标方法执行之前和之后都可以执行。


5. Spring AOP的配置

Spring AOP的配置可以使用XML或注解方式。以下是使用注解配置AOP的示例。

1.在pom.xml文件中添加Spring AOP的依赖:

<dependencies>
    <!-- Spring AOP -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-aop</artifactId>
    </dependency>
    <!-- 其他依赖项 -->
</dependencies>

 

2. 定义切面

接下来,定义一个切面类,包含切入点和通知:

package com.example.aopdemo.aspect;
 
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.stereotype.Component;
 
@Aspect
@Component
public class LoggingAspect {
 
    @Before("execution(* com.example.aopdemo.service.*.*(..))")
    public void logBeforeMethod() {
        System.out.println("Method execution started...");
    }
}

在上述代码中,我们定义了一个切面类LoggingAspect,并使用@Aspect注解标记它。@Before注解定义了一个前置通知,表示在com.example.aopdemo.service包下的所有类的所有方法执行之前,执行logBeforeMethod方法。

3. 启用AOP

在Spring Boot应用的主类中,使用@EnableAspectJAutoProxy注解启用AOP:

package com.example.aopdemo;
 
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.EnableAspectJAutoProxy;
 
@SpringBootApplication
@EnableAspectJAutoProxy
public class AopDemoApplication {
 
    public static void main(String[] args) {
        SpringApplication.run(AopDemoApplication.class, args);
    }
}

 

4. 目标类

定义一个目标类和方法,以便演示AOP通知的应用:

package com.example.aopdemo.service;
 
import org.springframework.stereotype.Service;
 
@Service
public class UserService {
 
    public void createUser() {
        System.out.println("Creating user...");
    }
}

 

5. 测试AOP

编写一个控制器或测试类来触发目标方法:

package com.example.aopdemo.controller;
 
import com.example.aopdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class UserController {
 
    @Autowired
    private UserService userService;
 
    @GetMapping("/createUser")
    public String createUser() {
        userService.createUser();
        return "User creation initiated";
    }
}package com.example.aopdemo.controller;
 
import com.example.aopdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class UserController {
 
    @Autowired
    private UserService userService;
 
    @GetMapping("/createUser")
    public String createUser() {
        userService.createUser();
        return "User creation initiated";
    }
}package com.example.aopdemo.controller;
 
import com.example.aopdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class UserController {
 
    @Autowired
    private UserService userService;
 
    @GetMapping("/createUser")
    public String createUser() {
        userService.createUser();
        return "User creation initiated";
    }
}package com.example.aopdemo.controller;
 
import com.example.aopdemo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class UserController {
 
    @Autowired
    private UserService userService;
 
    @GetMapping("/createUser")
    public String createUser() {
        userService.createUser();
        return "User creation initiated";
    }
}

 启动应用程序并访问/createUser端点,您将看到以下输出:

Method execution started...
Creating user... 

通过上述步骤,我们已经成功地使用Spring AOP实现了日志记录的功能。在目标方法执行之前,日志记录通知被触发并执行。

6. AOP与其他技术的对比

 

结论


面向切面编程(AOP)为Java开发者提供了一种强大的工具来处理横切关注点,使代码更加模块化和可维护。通过Spring AOP,我们可以轻松地将日志记录、事务管理、安全检查等功能分离出来,集中管理。这不仅提高了代码的可读性和可维护性,也使得我们的应用程序更加灵活和健壮。

AOP虽然强大,但也需要谨慎使用。在设计和实现AOP时,应仔细考虑其对代码复杂性和性能的影响,以确保其带来的好处大于其引入的开销。

 

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

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

相关文章

SPI通信(软件模拟)

1 软件SPI程序框架 2 软件SPI交换一个字节的先后顺序 3 读取W25q64芯片厂商ID,设备ID 4 宏定义W26q64指令码 5 页缓冲区最大256字节&#xff0c;超过就会忙碌 6 页编程

生产环境中变态开启devtools(强制)

写到最前面 首先&#xff0c;你已经下载了google的插件【vue devtools】&#xff0c;不知道怎么下载&#xff0c;留言博主 如果你想看的项目中的vuetools插件打开是这样的 Vue.js is detected on this page. Devtools inspection is not available because it’s in product…

【中学教资-信息技术】多媒体文件大小的存储

图像/音频/视频文件大小的计算 1 图像文件2 音频文件3 视频文件4 例题5 总结 视频讲解&#xff1a;音频文件大小/视频文件大小计算-失舵之舟 1 图像文件 压缩比原始大小/被压缩之后大小 颜色深度&#xff1a;指图像中每个像素所占的二进制位数&#xff08;bit&#xff09; n位…

BioXM一款实用的生物小软件

软件介绍 BioXM是一款非常简单明了的分子生物学软件&#xff0c;全中文操作界面非常友好。 DNA序列分析、蛋白质序列分析、多序列比对、氨基酸相似性计算、酶切位点分析、ORF分析、分子量和等电点预测、序列数据库等。 软件下载 https://pan.quark.cn/s/84df485efd6e安装教…

Vxe UI vue vxe-table 如何在表格中使用上传附件、上传图片

Vxe UI vue vxe-table 如何在表格中使用上传附件、上传图片 效果图 在表格中显示缩略图模式上传附件或图片 点击更多按钮查看全部 鼠标拖动上传 代码 <template><div><vxe-grid v-bind"gridOptions"></vxe-grid></div> </tem…

第九周:机器学习

目录 摘要 Abstract 一、RNN 1、引入 2、RNN的分类 二、LSTM 1、基本结构 2、具体步骤 3、举例说明 4、原理理解 总结 摘要 本周主要围绕RNN进行探讨&#xff0c;从为什么需要这类”循环网络“入手&#xff0c;提到了”slot filling“技术&#xff0c;接着又对R…

大模型赋能风控运营:效率跃升的密码

一、大模型助力风控运营的背景与趋势 大模型兴起的背景 随着金融行业的迅速发展和数据量的爆炸式增长&#xff0c;传统的风控运营手段逐渐难以满足复杂多变的风险形势。大数据、人工智能等技术的不断进步&#xff0c;为大模型在风控运营领域的应用提供了技术支撑。金融机构面…

海洋大地测量基准与水下导航系列之一引子

海底大地基准网是一组布放在海底的声学基准站&#xff0c;组建类似GNSS星座的定位系统&#xff0c;既可以对水面及水下的各类设备提供时间和空间信息&#xff0c;也可用来监测海底板块及水体环境的动态变化。海底声学基准站与海面GNSS、海底重力站联合打造立体的观测控制网&…

十道MySQL必问面试题

你是如何理解最左前缀原则的&#xff1f;你是如何理解行锁、GAP锁、临键锁的&#xff1f;你是如何理解MVCC的&#xff1f;你是如何理解count(*)和count(1)的&#xff1f;你是如何理解Online DDL的&#xff1f;你知道哪些情况下会导致索引失效&#xff1f;你是如何理解filesort的…

fastmock使用

FastMock 是一个在线工具&#xff0c;用于快速创建和管理模拟 API&#xff08;Mock API&#xff09;。它主要用于前端开发&#xff0c;允许开发者在没有真实后端服务的情况下&#xff0c;模拟 API 响应&#xff0c;从而加速开发和测试过程。 FastMock网址&#xff1a;fastmock.…

Java多进程调用dll程序和exe程序

&#x1f3af;导读&#xff1a;本文介绍了使用Java调用本地DLL及EXE程序的方法。针对DLL调用&#xff0c;文章提供了基于Java Native Access (JNA) 库的具体实现方案&#xff0c;包括定义Java接口以映射DLL中的函数&#xff0c;并展示了如何加载DLL及调用其中的方法。对于EXE程…

Python 数据可视化:工具与实践

文章目录 数据可视化可视化库特点对比实例&#xff1a;绘制基本数据分布图评估维度 交互式可视化与静态图表实例&#xff1a;创建交互式折线图评估维度 实时数据可视化实例&#xff1a;展示实时股票数据评估维度 图表设计原则实例&#xff1a;设计适合展示销售数据的条形图评估…

论文辅助笔记:LP_BERT

1 train_task1.py 1.1 main部分 读取命令行参数&#xff0c;调用task1函数 1.2 task1 train 1.3 task1 valid 1.3 collate_fn 2 Dataset 2.1 train dataset 2.2 valid dataset 3 LPBERT 3.1 不同的embedding day-of-week embedding和time-of-day embedding X位置和Y位置的…

色彩与笔触的交响:广州米塔在线科教技术有限公司揭秘PS绘画秘籍!

在数字艺术的广阔天地里,PS无疑是一颗璀璨的明星&#xff0c;它不仅在图像处理领域独领风骚&#xff0c;更以其强大的功能成为了众多艺术家和设计师进行数字绘画的首选工具。广州米塔在线科教技术有限公司&#xff0c;作为致力于艺术教育与技术分享的平台&#xff0c;深知掌握P…

sealos快速搭建k8s集群

一&#xff0c;环境准备 1&#xff0c;三台&#xff08;搭建一主两从集群&#xff09;或五台&#xff08;三主两从集群&#xff09;虚拟机&#xff0c; 安装alimaLinux系统 &#xff0c;相同的root密码&#xff0c;不要安装docker。 如果是alimaLinux-mini版本操作系统&#xf…

PMP–知识卡片--SCQA金字塔表达

SCQA模型通过四个关键元素&#xff1a;情景冲突疑问答案&#xff0c;建立了一个精确而有逻辑的表达框架。同时&#xff0c;它也能够帮助你构建合理的逻辑链条&#xff0c;让别人更容易理解和接受你的观点。 情景&#xff1a;通过描述背景和现状引入话题&#xff0c;这个元素帮助…

两个月冲刺软考——关系模式中的候选关键字与如何分解为无损连接并保持函数依赖的解法(例题讲解,看完必会)

1. 数据库中的简单属性、多值属性、复合属性、派生属性 简单属性&#xff1a;指不能够再分解成更小部分的属性&#xff0c;通常是数据表中的一个列。例如学生表中的“学号”、“姓名”等均为简单属性。 多值属性&#xff1a;指一个属性可以有多个值。例如一个学生可能会有多个…

掌握EF Core:全方位面试指南,助你从初级到高级轻松晋级

一、前言 这份指南旨在帮助你为主要考察 Entity Framework Core (EF Core) 的面试做好准备&#xff0c;内容涵盖基础、中级和高级三个不同经验级别。每个级别包括10个高频面试题&#xff0c;附有解题思路和详细的解答示例。 二、基础级别 重点在于 EF Core 的基本概念和使用…

nginx源码编译

华子目录 准备下载nginx源码包关闭firewalld和selinux安装依赖环境 安装解压关闭nginx的debug功能执行./configure进行环境检测添加nginx系统用户使用make编译使用make install安装 进入到prefix指定的目录中查看启动nginx服务关闭nginx添加nginx环境变量卸载nginx 准备 下载n…

猫头虎 分享:Python库 SciPy 的简介、安装、用法详解入门教程

&#x1f42f; 猫头虎 分享&#xff1a;Python库 SciPy 的简介、安装、用法详解入门教程 今天猫头虎带您深入探索SciPy&#xff0c;一个在数据科学和人工智能领域必不可少的Python库&#xff01; &#x1f4dd; 摘要 在数据科学和人工智能领域&#xff0c;SciPy 是一个关键的…