当前位置: 首页 > article >正文

Spring框架 - AOP配置文件形式

目录AOP什么是AOP什么是横切面关注点AOP的优势AOP底层原理AOP实现形式AOP核心术语AOP - 配置文件形式切入点的表达式通知类型转账案例操作AOP什么是AOPAOPAspect Oriented Programming的缩写)意为面向切面编程是一种编程范式用于解决横切面关注点的问题。什么是横切面关注点横切关注点是指那些跨域应用程序多个模块的功能例如日志记录事务管理安全控制性能监控异常处理AOP的优势运行期间在不修改代码的情况下对已有的方法进行增强。减少重复代码提高开发效率方便维护AOP底层原理JDK的动态代理技术Cglib的动态代理技术AOP实现形式配置文件形式半注解形式全注解形式AOP核心术语Joinpoint(连接点)是指那些被拦截到的点在spring中,这些点指的是方法Pointcut(切入点)是指要对哪些Joinpoint进行拦截的定义Advice(通知/增强)是指拦截到Joinpoint之后所要做的事情就是通知。通知分为前置通知后置通知异常通知最终通知环绕通知(四个通知的总体)Target(目标对象)代理的目标对象Weaving(织入)是指把增强应用到目标对象来创建新的代理对象的过程Proxy(代理) 一个类被AOP织入增强后就产生一个结果代理类由Spring提供Aspect(切面)是切入点和通知的结合自己编写和配置AOP - 配置文件形式切入点的表达式execution([修饰符] 返回值类型 包名.类名.方法名(参数))修饰符可以省略不写不是必须要出现的返回值类型是不能省略不写的根据你的方法来编写返回值。可以使用 * 代替。示例精准表达式execution(public void com.qcbyjy.demo2.UserServiceImpl.save())通用表达式execution(* com.qcby.*.*ServiceImpl.*(..))save开头的所有方法execution(* com.qcby.*.*ServiceImpl.save*(..))通知类型类型含义AOP切面声明标签实例前置通知目标方法执行前进行增强aop:before后置通知目标方法执行成功或失败进行增强aop:after-returning异常通知目标方法执行成功后进行增强aop:after-throwing最终通知目标方法执行失败后进行增强aop:after环绕通知(四个通知的总体)目标方法执行前后都可以进行增强。目标对象的方法需要手动执行。aop:around示例!--配置AOP的增强--aop:config!--配置切面 切入点 通知组成--aop:aspectrefmyAspect!--前置通知--aop:beforemethodlogpointcutexecution(* com.qcby.*.*ServiceImpl.save*(..))/aop:before!--后置通知--aop:after-returningmethodlogpointcutexecution(* com.qcby.*.*ServiceImpl.save*(..))/aop:after-returning!--异常通知--aop:after-throwingmethodlogpointcutexecution(* com.qcby.*.*ServiceImpl.save*(..))/aop:after-throwing!--最终通知--aop:aftermethodlogpointcutexecution(* com.qcby.*.*ServiceImpl.save*(..))/aop:after!--环绕通知--aop:aroundmethodaroundLogpointcutexecution(* com.qcbyjy.*.*ServiceImpl.save*(..))//aop:aspect/aop:config转账案例操作创建maven Java项目编写pom.xml文件引入依赖新加入了AOP联盟、Spring Aspects、aspectj这三个依赖dependenciesdependencygroupIdorg.springframework/groupIdartifactIdspring-context/artifactIdversion5.0.2.RELEASE/version/dependencydependencygroupIdcommons-logging/groupIdartifactIdcommons-logging/artifactIdversion1.2/version/dependencydependencygroupIdlog4j/groupIdartifactIdlog4j/artifactIdversion1.2.12/version/dependency!--有单元测试的环境Spring5版本Junit4.12版本--dependencygroupIdjunit/groupIdartifactIdjunit/artifactIdversion4.12/versionscopetest/scope/dependency!-- 连接池 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.10/version/dependency!-- mysql驱动包 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.6/version/dependency!-- Spring整合Junit测试的jar包 --dependencygroupIdorg.springframework/groupIdartifactIdspring-test/artifactIdversion5.0.2.RELEASE/versionscopetest/scope/dependency!-- AOP联盟 --dependencygroupIdaopalliance/groupIdartifactIdaopalliance/artifactIdversion1.0/version/dependency!-- Spring Aspects --dependencygroupIdorg.springframework/groupIdartifactIdspring-aspects/artifactIdversion5.0.2.RELEASE/version/dependency!-- aspectj --dependencygroupIdorg.aspectj/groupIdartifactIdaspectjweaver/artifactIdversion1.8.3/version/dependency/dependencies创建Spring配置文件applicationContext.xml引入具体的AOP的schema约束?xml version1.0encodingUTF-8?beans xmlnshttp://www.springframework.org/schema/beansxmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexmlns:aophttp://www.springframework.org/schema/aopxsi:schemaLocationhttp://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd/beans编写实体类Account类编写持久层的接口和实现类AccountDao类和AccountDaoImpl类packagecom.qcby.dao;publicinterfaceAccountDao{/** * 转账 * param name 转账人 * param money 金额 */publicvoidoutMoney(Stringname,doublemoney);/** * 收账 * param name 收帐人 * param money 金额 */publicvoidinMoney(Stringname,doublemoney);}packagecom.qcby.dao.impl;importcom.qcby.dao.AccountDao;importcom.qcby.tools.TxUtils;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.SQLException;publicclassAccountDaoImplimplementsAccountDao{OverridepublicvoidoutMoney(Stringname,doublemoney){try{//把数据存储到数据库中//先获取到连接ConnectionconnTxUtils.getConnection();//编写sql语句Stringsqlupdate account set money money - ? where name ?;//预编译sql语句PreparedStatementstmtconn.prepareStatement(sql);//设置值stmt.setDouble(1,money);stmt.setString(2,name);//执行操作stmt.execute();//关闭资源conn不能关闭stmt.close();}catch(SQLExceptione){e.printStackTrace();}}OverridepublicvoidinMoney(Stringname,doublemoney){try{ConnectionconnTxUtils.getConnection();Stringsqlupdate account set money money ? where name ?;PreparedStatementstmtconn.prepareStatement(sql);stmt.setDouble(1,money);stmt.setString(2,name);stmt.execute();stmt.close();}catch(SQLExceptione){e.printStackTrace();}}}编写业务层的接口和实现类AccountService类和Account ServiceImpl类packagecom.qcby.service;publicinterfaceAccountService{/** * * param out 转账 * param in 收账 * param money 金额 */publicvoidpay(Stringout,Stringin,doublemoney);}packagecom.qcby.service.impl;importcom.qcby.dao.AccountDao;importcom.qcby.service.AccountService;publicclassAccountServiceImplimplementsAccountService{privateAccountDaoaccountDao;publicvoidsetAccountDao(AccountDaoaccountDao){this.accountDaoaccountDao;}/** * * param out 转账人 * param in 收帐人 * param money 金额 */Overridepublicvoidpay(Stringout,Stringin,doublemoney){// 调用dao中方法accountDao.outMoney(out,money);accountDao.inMoney(in,money);}}编写切片类MyAspect类packagecom.qcby.tools;//切面类publicclassMyAspect{//开启事务publicvoidstart(){TxUtils.startTransaction();}//提交事务publicvoidcommit(){TxUtils.commit();}//回滚事务publicvoidrollback(){TxUtils.rollback();}//关闭事务publicvoidclose(){TxUtils.close();}}将目标类配置到Spring中beanidaccountServiceclasscom.qcby.service.impl.AccountServiceImplpropertynameaccountDaorefaccountDao/property/beanbeanidaccountDaoclasscom.qcby.dao.impl.AccountDaoImpl/bean在配置文件中定义切面类beanidmyAspectclasscom.qcby.tools.MyAspect/bean在配置文件中完成aop的配置aop:config!--配置切面 切入点 通知组成--aop:aspectrefmyAspect!--前置通知开启事务--aop:beforemethodstartpointcutexecution(* com.qcby.service.impl.AccountServiceImpl.*(..))/aop:before!--后置通知提交事务--aop:after-returningmethodcommitpointcutexecution(* com.qcby.service.impl.AccountServiceImpl.*(..))/aop:after-returning!--异常通知回滚事务--aop:after-throwingmethodrollbackpointcutexecution(* com.qcby.service.impl.AccountServiceImpl.*(..))/aop:after-throwing!--最终通知关闭连接--aop:aftermethodclosepointcutexecution(* com.qcby.service.impl.AccountServiceImpl.*(..))/aop:after/aop:aspect/aop:config编程测试类AccountTest类packagecom.qcby.test;importcom.qcby.service.AccountService;importorg.junit.Test;importorg.junit.runner.RunWith;importorg.springframework.beans.factory.annotation.Autowired;importorg.springframework.test.context.ContextConfiguration;importorg.springframework.test.context.junit4.SpringJUnit4ClassRunner;RunWith(SpringJUnit4ClassRunner.class)ContextConfiguration(classpath:applicationContext.xml)publicclassAccountTest{AutowiredpublicAccountServiceaccountService;TestpublicvoidtestPay(){accountService.pay(喜羊羊,懒羊羊,100);}}

相关文章:

Spring框架 - AOP配置文件形式

目录AOP什么是AOP?什么是横切面关注点?AOP的优势AOP底层原理AOP实现形式AOP核心术语AOP - 配置文件形式切入点的表达式通知类型转账案例操作AOP 什么是AOP? AOP(Aspect Oriented Programming的缩写),意为&#xff1a…...

本地GPU预训练Llama模型:技术与优化实践

1. 本地GPU预训练Llama模型的核心价值在本地GPU上预训练Llama模型这件事,本质上是在挑战大模型训练的传统范式。过去三年我尝试过各种规模的模型训练,从Colab的免费GPU到AWS的8卡A100集群,最深刻的体会就是:当你可以用消费级显卡完…...

Phi-3-mini-4k-instruct-gguf惊艳效果展示:10个真实Prompt生成结果全公开

Phi-3-mini-4k-instruct-gguf惊艳效果展示:10个真实Prompt生成结果全公开 1. 模型简介 Phi-3-Mini-4K-Instruct是一个38亿参数的轻量级开源模型,采用GGUF格式提供。作为Phi-3系列的一员,这个模型经过精心训练,专注于高质量内容和…...

工厂巡检新助手:Youtu-VL-4B目标检测实战,快速定位设备零件与统计数量

工厂巡检新助手:Youtu-VL-4B目标检测实战,快速定位设备零件与统计数量 1. 引言:工厂巡检的痛点与AI解决方案 在制造业工厂的日常运营中,设备巡检是一项至关重要但又耗时费力的工作。传统的人工巡检方式面临着诸多挑战&#xff1…...

lora-scripts支持增量训练:基于已有模型快速迭代,持续优化你的AI

LoRA-Scripts支持增量训练:基于已有模型快速迭代,持续优化你的AI 1. 为什么需要增量训练? 在AI模型训练过程中,我们经常会遇到这样的困境:当你花费大量时间训练出一个不错的LoRA模型后,突然发现还需要补充…...

jScrollPane移动端适配:触控滚动条的完整解决方案

jScrollPane移动端适配:触控滚动条的完整解决方案 【免费下载链接】jScrollPane Pretty, customisable, cross browser replacement scrollbars 项目地址: https://gitcode.com/gh_mirrors/js/jScrollPane jScrollPane是一款功能强大的自定义滚动条插件&…...

线性代数实战:矩阵运算在AI与工程中的应用指南

1. 线性代数实战精要:拒绝空谈的矩阵思维训练手册刚接手机器学习项目时,我对着特征矩阵发懵的日子还历历在目。当时翻遍教材只看到满页的数学符号推导,却找不到"什么时候该用特征分解"、"为什么SVD能解决推荐系统冷启动"…...

Python实现经验分布函数(EDF)的完整指南

1. 经验分布函数基础概念经验分布函数(Empirical Distribution Function, EDF)是统计学中用于描述样本数据分布特征的非参数方法。当我们在Python中处理实际数据时,EDF能够在不假设数据服从任何特定理论分布的情况下,直接基于观测…...

神经网络层数与节点配置的黄金法则与实践

1. 神经网络层数与节点配置的核心逻辑神经网络的结构设计就像建造一栋大楼,层数和每层的节点数决定了整个建筑的承重能力与空间利用率。我在实际项目中发现,90%的模型性能问题都源于结构配置不当。这里有个反直觉的事实:更多层和节点并不总是…...

Focus架构:多模态视频处理的流式压缩技术

1. Focus架构设计背景与核心挑战视觉语言模型(Vision-Language Models, VLMs)作为多模态AI领域的重要突破,正在彻底改变人机交互的方式。这类模型能够同时理解图像/视频内容和自然语言指令,完成从视频描述生成到复杂视觉问答等一系…...

SDMatte API设计实践:遵循RESTful规范构建可扩展服务

SDMatte API设计实践:遵循RESTful规范构建可扩展服务 1. 为什么需要规范的API设计 当你开发一个像SDMatte这样的图像处理服务时,API就是你和用户对话的桥梁。一套设计良好的API能让开发者用起来顺手,维护起来轻松,扩展起来简单。…...

Voxtral-4B-TTS-2603开源大模型:无需License的商用级多语言TTS替代方案

Voxtral-4B-TTS-2603开源大模型:无需License的商用级多语言TTS替代方案 1. 平台介绍 Voxtral-4B-TTS-2603是Mistral发布的一款开源语音合成模型,专为生产环境设计。这个模型最大的特点是完全开源且商用免费,为企业提供了一个高质量的TTS替代…...

Phi-3.5-mini-instruct惊艳案例:从模糊需求描述生成可运行Python脚本

Phi-3.5-mini-instruct惊艳案例:从模糊需求描述生成可运行Python脚本 1. 引言 想象一下这样的场景:你脑海中有一个模糊的编程需求,但不确定具体该怎么实现。传统方式可能需要反复搜索、尝试各种代码片段,甚至需要请教同事。现在…...

Qwen3.5-2B开源大模型教程:模型权重分片加载、显存峰值控制技巧详解

Qwen3.5-2B开源大模型教程:模型权重分片加载、显存峰值控制技巧详解 1. 模型概述 Qwen3.5-2B是阿里云推出的轻量化多模态基础模型,属于Qwen3.5系列的小参数版本(20亿参数)。该模型主打低功耗、低门槛部署,特别适配端…...

文脉定序入门必看:从零构建高精度语义重排序服务(含代码实例)

文脉定序入门必看:从零构建高精度语义重排序服务(含代码实例) 1. 什么是文脉定序?为什么需要它? 你有没有遇到过这样的情况:用搜索引擎找到了很多相关文档,但最想要的答案却排在了后面&#x…...

Real Anime Z保姆级教程:Streamlit界面零配置启动+Turbo参数详解

Real Anime Z保姆级教程:Streamlit界面零配置启动Turbo参数详解 1. 工具介绍 Real Anime Z是一款基于阿里云通义Z-Image底座模型开发的高精度二次元图像生成工具。它通过专属的Real Anime Z微调权重,专门优化了真实系二次元风格的生成效果。 这个工具…...

ElasticSearch关键概念教程

ElasticSearch关键概念教程(更新中) 文章目录ElasticSearch关键概念教程(更新中)应用场景Index(待更新)Mapping(待更新)Document(待更新) 应用场景 这是一个专…...

nli-MiniLM2-L6-H768与相似度模型的区别:何时该用推理而非检索

nli-MiniLM2-L6-H768与相似度模型的区别:何时该用推理而非检索 1. 核心能力对比 自然语言推理模型nli-MiniLM2-L6-H768与传统的语义相似度模型(如Sentence-BERT)在功能定位上存在本质差异。前者专注于分析文本间的逻辑关系,后者…...

MIT 6.824 lab3B/C

前言 花两天把lab3B/C写了一下,有了A的基础,简单了不少。gitee地址放在末尾。 一、3B/3C 前的整体认知 1.1 3B 的目标 Leader 接收 Start(command) → 追加到 rf.logs → 复制到多数派 → 推进 commitIndex → 通过 applyChan 交给状态机。 1.2 3C 的…...

ORM调用mysql库函数,实现时间+天数

时间字段天数字段计算后时间调用数据库DATE_ADD构建ORM可使用的公共方法class DateAdd(Func):function DATE_ADDdef __init__(self, expression, bufferday1, **extra):self.template %(function)s(%(expressions)s, INTERVAL {} DAY).format(bufferday)super(DateAdd, self)…...

深度学习(4)自动求导

1. 向量链式法则① 例子1是一个线性回归的例子,如下图所示。内积是一个标量,相当于对标量求导标量对行向量求导结果还是行向量这时,X是一个矩阵这里统一采用分子布局,分子布局和分母布局只差一个转置。I为单位矩阵2. 自动求导3. 计…...

【Linux3】压缩解压缩,命令解释器,账户和组管理,文件系统权限

1.压缩解压缩:压缩:下载unzip:自动压缩tar (归档)压缩后剩10M这里605行是压缩格式,613行是解压格式tar(归档)命令可以直接用gz进行压缩,直接一步压缩为10M解压:指定解压路径2.命令解…...

南京邮电大学电装实习报告-2026版

...

凸包(Convex Hull)

目录 1、前言 1.1什么是凸包 2、算法基础铺垫 2.1数学基础 2.1.1叉积 2.2数据结构基础 2.2.1栈 3、算法实现(C) 3.1算法(Andrew)讲解 3.2代码复现 1、前言 1.1什么是凸包 给定二维平面上的点集,凸包就是将…...

Youtu-VL-4B-Instruct优化技巧:如何调整参数让图片问答更准确、描述更生动

Youtu-VL-4B-Instruct优化技巧:如何调整参数让图片问答更准确、描述更生动 当你第一次使用Youtu-VL-4B-Instruct模型时,可能会遇到这样的困惑:为什么同样的图片,有时候能得到详细生动的描述,有时候回答却简短模糊&…...

fpga系列 HDL : Microchip FPGA开发软件 Libero Soc选择RAM IP(Two Port IP核)

Catalog下选择ram IP 特性RAM - Dual PortRAM - Two Port别名通常指 True Dual-Port RAM通常指 Simple Dual-Port RAM端口功能两个端口均可读可写 (R/W)端口功能分离:一个端口只写,另一个端口只读端口定义端口A和端口B是对等的,都可以独立进行…...

【vllm】(二)vLLM v1 Engine — 模块超深度逐行分析之三

3.10 core.py - 引擎核心文件职责: 实现vLLM推理的"内循环"——调度→执行→更新,这是GPU推理的真正驱动者。 3.10.1 EngineCore.init() 初始化流程 逐行解析: 加载插件: load_general_plugins() — 允许第三方插件注册创建ModelExecutor: exe…...

【Applicom】applicom PC Network Interfaces - Version 下载分享

applicom PC Network Interfaces 3.1-4.3applicom PC Network Interfaces 软件 介绍软件列表:使用注意相关资料下载地址applicom PC Network Interfaces 软件 介绍 找了很久才在一个网站找到的软件包,很多个版本,不常用软件,但是很难找全版本…...

ACM周报5

牛客周赛140:B题:s.find(m)时间复杂度是O(m)的,所以可能超时,可以用栈模拟,从后往前D,E题:本质是连通块问题,可以将所有ix和iy不超过n的位置放入一个集合中,用并查集实现&#xff0c…...

深度解析YOLOv11多光谱目标检测的技术实现与性能优化

深度解析YOLOv11多光谱目标检测的技术实现与性能优化 【免费下载链接】ultralytics Ultralytics YOLO 🚀 项目地址: https://gitcode.com/GitHub_Trending/ul/ultralytics 在农业监测、夜间安防、遥感分析等复杂视觉场景中,多光谱目标检测技术通过…...