AOP(面向切面编程)基于XML方式配置
概念解释:(理解基本概念方可快速入手)
连接点(joinpoint)
被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法。
切入点(pointcut)
切入点是指我们要对哪些连接点进行拦截的定义
通知(advice)
所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类
切面(aspect)
是切入点和通知的结合
通知顺序:
前置通知:aop:before
后置通知:aop:after-returning【try】
最终通知:aop:after【finally】
异常通知:aop:after-throwing【catch】
环绕通知:aop:around
try{
...
return aop:after-returning
}catch(Exception e){
...
aop:after-throwing
}finally{
...
aop:after
}
切点表达式:
格式:execution([修饰符] 返回值 报名.类名.方法名(参数))
eg:execution(* com.by.service.*.*(..))
实例演示:
pom.xml:
<dependencies><!--ioc--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>6.0.12</version></dependency><!--支持切点表达式AOP --><dependency><groupId>org.springframework</groupId><artifactId>spring-aspects</artifactId><version>5.1.8.RELEASE</version></dependency><dependency><groupId>org.slf4j</groupId><artifactId>slf4j-log4j12</artifactId><version>1.7.19</version></dependency></dependencies>
UserDaoImpl:
package com.by.dao;public class UserDaoImpl implements UserDao {@Overridepublic void addUser(){System.out.println("insert into tb_user......");}
}
UserServiceImpl:
package com.by.service;import com.by.dao.UserDao;public class UserServiceImpl implements UserService {private UserDao userDao;public void setUserDao(UserDao userDao) {this.userDao = userDao;}@Overridepublic void addUser(){userDao.addUser();System.out.println(8/0);}
}
MyLogActive:(增强类)
/** Copyright (c) 2020, 2024, All rights reserved.**/
package com.by.advice;import org.aspectj.lang.ProceedingJoinPoint;/*** <p>Project: Spring - MyLogAdvice</p>* <p>Powered by scl On 2024-01-05 15:04:11</p>* <p>描述:<p>** @author 孙臣龙 [1846080280@qq.com]* @version 1.0* @since 17*/
public class MyLogAdvice {public void after() {System.out.println("最终通知、、、");}public void before() {System.out.println("前置通知、。、");}public void afterReturn(){System.out.println("后置通知");}public void afterThrowing(){System.out.println("异常通知");}public void around(ProceedingJoinPoint joinPoint) {try {System.out.println("前环绕通知。。。");joinPoint.proceed();System.out.println("后环绕通知。。。");} catch (Throwable e) {throw new RuntimeException(e);}}
}
applicationContext.xml:
<?xml version="1.0" encoding="UTF-8"?>
<!--注意:添加约束-->
<beans xmlns="http://www.springframework.org/schema/beans"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xmlns:aop="http://www.springframework.org/schema/aop"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsd"><bean id="userDao" class="com.by.dao.UserDaoImpl"></bean><bean id="userService" class="com.by.service.UserServiceImpl"><property name="userDao" ref="userDao"></property></bean><!--增强--><bean id="myLogAdvice" class="com.by.advice.MyLogAdvice"></bean><!--aop--><aop:config><!--切点--><aop:pointcut id="pointcut" expression="execution(* com.by.service.*.*(..))"/><!--切面--><aop:aspect ref="myLogAdvice"><aop:before method="before" pointcut-ref="pointcut"></aop:before><aop:after method="after" pointcut-ref="pointcut"></aop:after><aop:around method="around" pointcut-ref="pointcut"></aop:around><aop:after-returning method="afterReturn" pointcut-ref="pointcut"></aop:after-returning><aop:after-throwing method="afterThrowing" pointcut-ref="pointcut"></aop:after-throwing></aop:aspect></aop:config></beans>
没增强前结果展示:
增强之后结果展示:
相关文章:
AOP(面向切面编程)基于XML方式配置
概念解释:(理解基本概念方可快速入手) 连接点(joinpoint) 被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法。 切入点(pointcut&#x…...
多线程的概念
多线程 同时执行多个任务,例如一个人一边听歌,一边跳舞 继承Thread类实现多线程的方式 定义一个MyThread类继承Thread类,重写里面的run方法 package com.itxs.demo01;/*** Classname : MyThread* Description : TODO 自定义线程继承Thread类*…...
DeepPurpose 生物化学深度学习库;蛋白靶点小分子药物对接亲和力预测虚拟筛选
参考: https://blog.csdn.net/c9Yv2cf9I06K2A9E/article/details/107649770 https://github.com/kexinhuang12345/DeepPurpose ##安装 pip install DeepPurpose rdkitDeepPurpose包括: 数据: 关联TDC库下载,是同一作者开发的 https://blog.csdn.net/weixin_42357472/artic…...
Java实现责任链模式
责任链模式是一种设计模式,用于处理请求的解耦。在责任链模式中,多个对象都有机会处理请求,从而避免了请求发送者和接收者之间的直接依赖关系。每个处理者都可以决定是否处理请求以及将请求传递给下一个处理者。 简介 责任链模式由一条链组…...
rabbitmq延时队列相关配置
确保 RabbitMQ 的延时消息插件已经安装和启用。你可以通过执行以下命令来安装该插件: rabbitmq-plugins enable rabbitmq_delayed_message_exchange 如果提示未安装,以下是安装流程: 查看mq版本: 查看自己使用的 MQ(…...
【工具】推荐一个好用的代码画图工具
PlantUML 官网地址:https://plantuml.com/zh/ 跳转 支持各种结构化数据画图支持代码调用jar包生成图片 提供在线画图能力 https://www.plantuml.com/plantuml/uml/SyfFKj2rKt3CoKnELR1Io4ZDoSa70000 有兴趣可以尝试下 over~~...
Leetcode14-判断句子是否为全字母句(1832)
1、题目 全字母句 指包含英语字母表中每个字母至少一次的句子。 给你一个仅由小写英文字母组成的字符串 sentence ,请你判断 sentence 是否为 全字母句 。 如果是,返回 true ;否则,返回 false 。 示例 1: 输入&am…...
HTTP和TCP代理原理及实现,主要是理解
Web 代理是一种存在于网络中间的实体,提供各式各样的功能。现代网络系统中,Web 代理无处不在。我之前有关 HTTP 的博文中,多次提到了代理对 HTTP 请求及响应的影响。今天这篇文章,我打算谈谈 HTTP 代理本身的一些原理,…...
MySQL中的连接池
数据库的连接池 1 )概述 网站连接数据库,为庞大用户的每次请求创建一个连接是不合适的关闭并重新连接的成本是很大的处理方法:设置最大值, 最小值, 设置最多闲置连接,设置等待阻塞 2 )示例演示 import threading i…...
css计时器 animation实现计时器延时器
css计时器 animation实现计时器延时器 缺点当切页面导航会休眠不执行 最初需求是一个列表每个项目都有各自的失效时间 然后就想到 计时器延时器轮询等方案 这些方案每一个都要有自己的计时器 感觉不是很好 轮询也占资源 然后突发奇想 css能不能实现 开始想到的是transition测…...
【win11 绕过TPM CPU硬件限制安装】
Qt编程指南 VX:hao541022348 ■ 下载iso文件■ 右键文件点击装载出现如下问题■ 绕过TPM CPU硬件限制安装方法■ 虚拟机安装win11 ■ 下载iso文件 选择Windows11 (multi-edition ISO)在选择中文 ■ 右键文件点击装载出现如下问题 ■ 绕过T…...
k8s的yaml文件中的kind类型都有哪些?(清单版本)
在操作kubernetes的过程中,我们接触到的yaml文件中的kind类型有很多。他们代表了kubernetes的不同类型的对象,了解了kind的类型,也就相当于了解了k8s都有哪些类型的对象。 类型清单及概要说明 序号类型简述1Pod一个Kubernetes中最基本的资源…...
Jetpack Room使用
Room使用 回顾 数据库有多张表,一张表只能记录一种Class,Class的具体属性是这个表的列;所有对表的操作都要通过Dao来访问 注解说明: Enity 作用于Class上,表示创建一张表记录该Class,Class内部属性使用…...
HarmonyOS应用开发之ArkTS语言学习记录
1、ArkTS介绍 ArkTS是鸿蒙生态的应用开发语言。它在保持TypeScript(简称TS)基本语法风格的基础上,对TS的动态类型特性施加更严格的约束,引入静态类型。同时,提供了声明式UI、状态管理等相应的能力,让开发者…...
windows 下 mongodb6.0 导入导出json文件
1.运行cmd窗口,进入MongoDB安装路径下的bin文件下,输入以下命令导入数据文件 mongoimport --host 127.0.0.1 --port 27017 --db <数据库名称,根据自个情况> -c <集合名称,自定义> --file <导入文件的路径名> …...
如何给 unplugin-vue-components/vite 写一个简单的 resolver
大部分工作 unplugin-vue-components 都已经处理好了, 我们只需要接收组件名来判断是否是自己的组件, 然后处理对应的导入逻辑。 一共 3 个字段 as 重命名类似 import { componentNameReName } from ‘xxxx’name 组件名 import { componentName } from ‘xxxx’from 导入路径…...
MYSQL篇--索引高频面试题
mysql索引 1什么是索引? 索引说白了就是一种数据结构,可以协助快速查询数据,以及更新数据库表中的数据,更通俗的来说索引其实就是目录,通过对数据建立索引形成目录,便于去查询数据,而mysql索引…...
视频号小店怎么上架商品?实操分享,干货满满!
我是电商珠珠 视频号小店从22年7月到现在也不过才发展了一年,它的风口才刚刚开始。 平台为了吸引商家入驻,会将大量红利向商家倾斜,只要把握住风口,就会很快起飞。 视频号小店对于很多人来说,都是新平台,…...
Python 常用数据类型
Python 常用数据类型有以下这些: 数据类型中文解析例子int整数,表示整数值1、2float浮点数,表示带有小数点的数值3.14、2.718complex复数,表示实部和虚部组成的复数12j、3-4jstr字符串,表示文本数据,用引号…...
基于yolov2深度学习网络的车辆行人检测算法matlab仿真
目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 2.算法运行软件版本 MATLAB2022a 3.部分核心程序 .......................................................... load yolov2.mat% 加载训练好的…...
【QT】中英文切换
很高兴在雪易的CSDN遇见你 前言 本文分享QT中如何进行中英文切换,希望对各位小伙伴有所帮助! 感谢各位小伙伴的点赞关注,小易会继续努力分享,一起进步! 你的点赞就是我的动力(^U^…...
vue实现代码编辑器,无坑使用CodeMirror
vue实现代码编辑器,无坑使用CodeMirror vue实现代码编辑器,使用codemirror5 坑:本打算cv一下网上的,结果发现网上的博客教程都是错的,而且博客已经是几年前的了,我重新看了github上的,发现安装的命令都已经不一样了。我…...
MR实战:网址去重
文章目录 一、实战概述二、提出任务三、完成任务(一)准备数据1、在虚拟机上创建文本文件2、上传文件到HDFS指定目录 (二)实现步骤1、创建Maven项目2、添加相关依赖3、创建日志属性文件4、创建网址去重映射器类5、创建网址去重归并…...
linux 内核编译安装
一、配置 默认配置 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- omap2plus_defconfig原配置 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- oldconfig 重新配置 make ARCHarm CROSS_COMPILEarm-linux-gnueabihf- menuconfig二 kernel zImage make ARCHarm CRO…...
hash基础知识(算法村第五关青铜挑战)
一、Hash的概念和基本特征 哈希(Hash)也称为散列,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,这个输出值就是散列值。 二、碰撞处理方法(2种) 在上面的例子中,我们发现有些在Hsh中很多位置可能要存两个甚…...
Linux第8步_USB设置
学习完设置“虚拟机的电源”后,接着学习通过鼠标点击操作U盘,目的是了解USB设置。 1、在桌面,双击“VMware Workstation Pro”图标,得到下图: 2、点击“编辑虚拟机”,得到下图: 只要点击编辑虚…...
第五节 强制规范commit提交 .husky/commit-msg: no-such file or directory问题解决办法
系列文章目录 目录 系列文章目录 前言 操作方法 总结 前言 在每次Git提交时,强制严格执行制定的规范。 操作方法 npm 安装commitlist 进行校验 npm install --save-dev @commitlint/config-conventional@12.1.4 @commitlint/cli@12...
2024年了,难道还不会使用谷歌DevTools么?
我相信您一定对Chrome浏览器非常熟悉,因为它是前端开发者最亲密的伙伴。我们可以使用它查看网络请求、分析网页性能以及调试最新的JavaScript功能。 除此之外,它还提供了许多功能强大但不常见的功能,这些功能可以大大提高我们的开发效率。 让我们来看看。 1. 重新发送XHR…...
springboot(ssm生产管理ERP系统 wms出入库管理系统Java系统
springboot(ssm生产管理ERP系统 wms出入库管理系统Java系统 开发语言:Java 框架:ssm/springboot vue JDK版本:JDK1.8(或11) 服务器:tomcat 数据库:mysql 5.7(或8.0)…...
通过使用别名让 SQL 更简短-数据库教程shulanxt.com-帆软软件有限公司
MySQL视频教程导航 https://www.shulanxt.com/database/mysqlvideo/p1 SQL 别名 SQL 别名 通过使用 SQL,可以为表名称或列名称指定别名。 基本上,创建别名是为了让列名称的可读性更强。 列的 SQL 别名语法 SELECT column_name AS alias_name FROM …...
中山建站公司/泉州百度广告
2019独角兽企业重金招聘Python工程师标准>>> 命令行如下启动即可: export LC_CTYPE"en_US.UTF-8" && steam 转载于:https://my.oschina.net/ITHaozi/blog/136652...
公司制作网站需要什么知识/线上电商怎么做
我们知道service命令是用于管理Linux系统中的各种服务的命令。其实service是位于系统中/usr/sbin/service的一个可执行的脚本,其内容如下: #!/bin/sh ########################################################################### # /usr/bin/service …...
jsp和php做网站那个快/马鞍山seo
使用inBitmap前使用inBitmap后一开始哪怕我看了这个图我也不太理解,后来我猜想应该是这样: 当某个bitmap不可达的时候,这个时候就是处于了可回收的状态 所以我们如果要复用的话,应该会把不可达的bitmap先recycler,然后…...
网站建设网站建设哪家好/万网创始人
前言 认识世界的任务和先决条件之一,就是要把本体论信息恰如其分地转化为认识论信息,为其后的决策提供依据。牢记工程上量级的概念有多重要,不同的量级差距有多大,而且越到后来差距越大。始终牢记这一条。 对于投资人来讲…...
做网站一年多少钱/google play官网下载
为什么我们写的代码都是 if-else?程序员想必都经历过这样的场景:刚开始自己写的代码很简洁,逻辑清晰,函数精简,没有一个 if-else,可随着代码逻辑不断完善和业务的瞬息万变:比如需要对入参进行类型和值进行判…...
响应式做的好的网站有哪些/地推app推广赚佣金
常见的安装错误总结: 如果是红帽,centos系列首先安装依赖软件。 yum install net-snmp-devel OpenIPMI OpenIPMI-devel rpm-build error:mysqlcilent library error: MYSQL library not find 安装mysql-devel error: Curl library…...