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

Javaee Spring的AOP简介

.SpringAOP简介

1.1 什么是AOP

   AOP Aspect Oriented Programming 的缩写,意思为面向切面编程,是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续,是软件开发中的一个热点,也是 Spring 框架中的一个重要内容。利用 AOP 可以对业务 逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低 ,提高程序的可重用性,同时提高了开发的效率。

1.2 AOP的作用及其优势

作用:在程序运行期间,在不修改源码的情况下对方法进行 增强
优势:减少重复代码,提高开发效率,并且便于维护

1.3 AOP的底层实现

      实际上, AOP 的底层是通过 Spring 提供的的动态代理技术实现的。在运行期间, Spring 通过动态代理技术 动态的生成代理对象,代理对象方法执行时进行增强功能的介入,在去调用目标对象的方法,从而完成功能 的增强。

1.4 AOP的动态代理技术

常用的动态代理技术
JDK 代理:基于接口的动态代理技术
cglib 代理:基于父类的动态代理技术

 1.5 JDK的动态代理

1.5.1 代理模式概述
    为什么要有 '' 代理 ''? 生活中就有很多代理的例子,例如,我现在需要出国,但是我不愿意自己去办签证、预定 机票和酒店(觉得麻烦 ,那么就可以找旅行社去帮我办,这时候旅行社就是代理,而我自己就是被代理了。 代理模式的定义:被代理者没有能力或者不愿意去完成某件事情,那么就需要找个人代替自己去完成这件事, 这个人就是代理者, 所以代理模式包含了 3 个角色 : 被代理角色 代理角色 抽象角色 ( 协议 )
1.5.2 静态代理
项目结构:
package wwx.test02;
public interface Sing {public void sing();
}
-------------------------------------------
package wwx.test02;public class JinLian implements Sing {@Overridepublic void sing() {System.out.println("jinlian在唱歌");}
}
-------------------------------------------
package wwx.test02;public class WangPo implements Sing{JinLian jinLian;public WangPo(JinLian jinLian) {this.jinLian = jinLian;}@Overridepublic void sing() {jinLian.sing();}
}
-------------------------------------------
package wwx.test02;public class XiMen {public static void main(String[] args) {JinLian jl=new JinLian();WangPo wp=new WangPo(jl);wp.sing();
//被代理者没有能力或者不愿意去完成某件事情,
//那么就需要找个人代替自己去完成这件事,这个人就是代理者
//静态代理模式:代理类是实际存在的,根据代理类生成一个代理对象
//动态代理模式:代理类是不存在的,直接动态生成一个代理对象
//实现了静态代理}
}
------------------------------------------

 

1.5.3 动态代理
    概述 : 动态代理就是直接通过反射生成一个代理对象 , 代理对象所属的类是不需要存在的 动态代理的获取: jdk提供一个Proxy类可以直接给实现接口类的对象直接生成代理对象
参数 1:ClassLoader loader 被代理对象的类加载器
参数 2:Class<?>[] interfaces 被代理对象的要实现的接口
参数 3:InvocationHandler h ( 接口 ) 执行处理接口
返回值 : 代理对象
2 个参数是为了帮助在 jvm 内部生成被代理对象的代理对象 , 3 个参数 , 用来监听代理对象调用方
, 帮助我们调用方法
回调方法 : 当代理对象调用了方法 , 就会来执行该 invoke 方法 , 在该方法中就可以增强
被代理类的方法
参数 1: 生成的代理对象 这里就是 p 这个代理对象 ( 慎用 )
参数 2: 当前代理对象执行的方法 这里 method 就是 happy() 方法对象
参数 3: 当前代理对象执行的方法 , 传入的实际参数
返回值 : 当前代理对象执行的方法的返回值
参数 1: 生成的代理对象 这里就是 p 这个代理对象 ( 慎用 )的原因: 
package wwx.test03;public class JianLian implements Sing{@Overridepublic void sing() {System.out.println("金莲在唱歌");}
}------------------------------------------------------------------------------------
------------------------
package wwx.test03;public interface Sing {public void sing();
}------------------------------------------------------------------------------------
------------------------package wwx.test03;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.Date;public class DemoTest {//    参数1:ClassLoader loader 被代理对象的类加载器
//    参数2:Class<?>[] interfaces 被代理对象的要实现的接口
//1.6 AOP相关概念
//    在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下:
//    Target(目标对象):代理的目标对象
//    Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
//    参数3:InvocationHandler h (接口)执行处理接口
//    返回值: 代理对象
//            前2个参数是为了帮助在jvm内部生成被代理对象的代理对象,第3个参数,用来监听代理对象调用方
//    法,帮助我们调用方法public static void main(String[] args) {JianLian jianLian=new JianLian();Sing p = (Sing) Proxy.newProxyInstance(JianLian.class.getClassLoader(),JianLian.class.getInterfaces(),new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {Date date=new Date();System.out.println(date);method.invoke(jianLian,args);return null;}});p.sing();}
}

 

1.6 AOP相关概念

   在正式讲解 AOP 的操作之前,我们必须理解 AOP 的相关术语,常用的术语如下:
Target (目标对象):代理的目标对象
Proxy (代理):一个类被 AOP 织入增强后,就产生一个结果代理类
Joinpoint (连接点):类里面哪些方法可以被增强,这些方法称为连接点, spring 只支持方法类型的连接点
Pointcut (切入点):实际被真正增强的方法,称为切入点
Advice (通知 / 增强):实际增强的逻辑部分称为通知(增强),通知有多种类型:
前置通知:指定增强的方法在切入点方法之前执行
后置通知:指定增强的方法在切入点方法之后执行
异常通知:指定增强的方法在出现异常时执行
最终通知:无论增强方式执行是否有异常都会执行
环绕通知:指定增强的方法在切入点方法之前和之后都执行
Aspect (切面):是切入点和通知(引介)的结合
Weaving (织入):是指把增强应用到目标对象来创建新的代理对象的过程。 spring 采用动态代理织入,而AspectJ 采用编译期织入和类装载期织入

1.7 AOP 开发明确的事项

1.7.1 需要编写的内容
编写核心业务代码(目标类的目标方法)
编写切面类,切面类中有通知 ( 增强功能方法 )
在配置文件中,配置织入关系,即将哪些通知与哪些连接点进行结合
1.7.2 AOP 技术实现的内容
Spring 框架监控切入点方法的执行。一旦监控到切入点方法被运行,使用代理机制,动态创建目标对象的代 理对象,根据通知类别,在代理对象的对应位置,将通知对应的功能织入,完成完整的代码逻辑运行。
1.7.3 AOP 底层使用哪种代理方式
spring 中,框架会根据目标类是否实现了接口来决定采用哪种动态代理的方式。

.基于XMLAOP开发

2.1 快速入门
1. 导入 AOP 相关坐标
2. 创建目标接口和目标类(内部有切点)
3. 创建切面类(内部有增强方法)
4. 将目标类和切面类的对象创建权交给 spring
5. applicationContext.xml 中配置织入关系
6. 测试代码

相关文章:

Javaee Spring的AOP简介

一.Spring的AOP简介 1.1 什么是AOP AOP 为 Aspect Oriented Programming 的缩写&#xff0c;意思为面向切面编程&#xff0c;是通过预编译方式和运行期动态代 理实现程序功能的统一维护的一种技术。AOP 是 OOP 的延续&#xff0c;是软件开发中的一个热点&#xff0c;也是…...

基于ansible初始化linux服务器基础环境。

大家好&#xff0c;今天我要和大家分享一个关于搭建centos环境的新方法。 以前我们经常会看到一些文章介绍如何搭建centos环境&#xff0c;但很多时候都会出现一些问题。不过现在有了一种新的方法&#xff0c;就是使用ansible脚本来实现。 虽然这种方法仅适用于centos7&#…...

leetcode-数据库题

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 175. 组合两个表176. 第二高的薪水177. 第N高的薪水178. 分数排名181. 超过经理收入的员工182. 查找重复的电子邮箱183. 从不订购的客户 175. 组合两个表 select p…...

[元来学NVMe协议] NVMe IO 指令集(NVM 指令集)| Flush 命令

声明 主页:元存储的博客_CSDN博客 依公开知识及经验整理,如有误请留言。 个人辛苦整理,付费内容,禁止转载。 内容摘要 前言 NVMe2.0 定义的三类命令集: 管理命令集、IO命令集、Fabrics命令集 Admin Command Set (管理命令集):用于控制器的管理,如创建/销毁IO提交队列…...

信息的相关性和冗余度:信息在整个文明中的作用

文章目录 I 古埃及的象形文字1.1 罗塞塔石碑1.2 古埃及文字音节和希腊字母的对应表1.3 破解古埃及文字 I 古埃及的象形文字 1.1 罗塞塔石碑 这个石碑是在公元前196年埃及国王托勒密五世加冕一周年的诏书。 在此前大约一百年&#xff0c;埃及已经被来自希腊北方城邦的亚历山大…...

python数据结构与算法-动态规划(最长公共子序列)

一、最长公共子序列问题 1、问题概念 一个序列的子序列是在该序列中删去若干元素后得 到的序列。 例如&#xff1a;"ABCD”和“BDF”都是“ABCDEFG”的子序列。 最长公共子序列(LCS) 问题: 给定两个序列X和Y&#xff0c;求X和Y长度最大的公共子字列。 例:X"ABBCBDE”…...

Java版企业电子招投标系统源码 Spring Cloud+Spring Boot 电子招标采购系统功能清单

一、立项管理 1、招标立项申请 功能点&#xff1a;招标类项目立项申请入口&#xff0c;用户可以保存为草稿&#xff0c;提交。 2、非招标立项申请 功能点&#xff1a;非招标立项申请入口、用户可以保存为草稿、提交。 3、采购立项列表 功能点&#xff1a;对草稿进行编辑&#x…...

【c语言】函数的基本概念 | 函数堆栈调用原理

创作不易&#xff0c;本篇文章如果帮助到了你&#xff0c;还请点赞支持一下♡>&#x16966;<)!! 主页专栏有更多知识&#xff0c;如有疑问欢迎大家指正讨论&#xff0c;共同进步&#xff01; 给大家跳段街舞感谢支持&#xff01;ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ ኈ ቼ ዽ ጿ…...

Vue.prototype 详解及使用

前言&#xff1a; 我们可能会在很多组件里用到数据/实用工具&#xff0c;但是不想污染全局作用域。这种情况下&#xff0c;可以通过在原型上定义它们使其在每个 Vue 的实例中可用。 1. 基本示例 在main.js中添加一个变量到 Vue.prototype Vue.prototype.$appName My App这…...

音视频八股文(3)--ffmpeg常见命令(2)

07-ffplay命令播放媒体 播放本地文件 播放本地 MP4 视频文件 test.mp4 的命令&#xff0c;从第 2 秒位置开始播放&#xff0c;播放时长为 10 秒&#xff0c;并且在窗口标题中显示 “test time”&#xff1a; ffplay -window_title "test time" -ss 2 -t 10 -autoe…...

使用bert4keras出现的问题(Process finished with exit code -1073741819 (0xC0000005))

1、环境 python 3.7.12 tensorflow 1.15 keras 2.3.1 bert4keras 0.9.7 protobuf 3.19.0 numpy 1.16.5 2、出现问题 numpy版本不兼容问题所以你就直接按照我的版本就可以了&#xff08;numpy 1.16.5&#xff09; Process finished with exit code -1073741819 (0xC0000005) …...

python协程实战

协程简介 协程(Coroutine)又称微线程、纤程&#xff0c;协程不是进程或线程&#xff0c;其执行过程类似于 Python 函数调用&#xff0c;Python 的 asyncio 模块实现的异步IO编程框架中&#xff0c;协程是对使用 async 关键字定义的异步函数的调用; 一个进程包含多个线程,类似…...

【论文笔记】VideoGPT: Video Generation using VQ-VAE and Transformers

论文标题&#xff1a;VideoGPT: Video Generation using VQ-VAE and Transformers 论文代码&#xff1a;https://wilson1yan. github.io/videogpt/index.html. 论文链接&#xff1a;https://arxiv.org/abs/2104.10157 发表时间&#xff1a; 2021年9月 Abstract 作者提出了…...

scala之基础面向对象

scala 既是面向对象 也是函数式编程 从Java 发展而来&#xff0c;依赖JVM环境 一、 scala 在linux中运行 scala 模式中直接编写运行 scala文件&#xff0c;load执行 scala编译程序 编译 运行 scala java 二、scala 数据类型 基础数据类型 val 不可变变量 函数式编程 …...

Qt5.12实战之多线程编程概念

1.为什么要使用多线程? a. 基于线程,同时处理多个任务,软件响应更灵敏 b.充分利用CPU的多核心功能增加应用运行效率 c.多线程在同一进程间使用共享通信更加高效 d.多个线程之间进行切换比多个进程之间进行切换,线程开销更少. 2.操作系统与进程关系 a. MS-DOS系统 属于单进程…...

格式化数据恢复怎么做?超实用的3种方法在这!

案例&#xff1a;格式化数据怎么恢复 【我的电脑前段时间中病毒了&#xff0c;无奈之下我只能将其格式化&#xff0c;但是很多重要的文件和图片之类的也一起被删除了&#xff0c;有什么方法可以恢复这些格式化的数据吗&#xff1f;非常着急&#xff01;】 格式化数据恢复&…...

【Java|golang】1105. 填充书架---动态规划

给定一个数组 books &#xff0c;其中 books[i] [thicknessi, heighti] 表示第 i 本书的厚度和高度。你也会得到一个整数 shelfWidth 。 按顺序 将这些书摆放到总宽度为 shelfWidth 的书架上。 先选几本书放在书架上&#xff08;它们的厚度之和小于等于书架的宽度 shelfWidt…...

linux基础命令

linux基础命令 一、linux命令 熟悉账务linux命令对运维的好处是巨大的&#xff0c;只有熟悉了命令咱们在运维的操作上才能如鱼得水。 系统信息 arch #显示机器的处理器架构(1) uname -m #显示机器的处理器架构(2) uname -r #显示正在使用的内核版本 dmidecode -q …...

【三十天精通Vue 3】 第十八天 Vue 3的国际化详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录 引言一、Vue 3 国际化概述1.1 国际化的概念1.2 国际化的作用1.3 V…...

02 - 学会提问

学会提问 一、引言 1.1 GPT简介 GPT&#xff08;Generative Pre-trained Transformer&#xff09;是一种基于Transformer架构的大型预训练语言模型。 凭借其强大的文本生成、理解和处理能力&#xff0c;GPT已在诸如自然语言处理、机器翻译、文本摘要等多个领域取得了显著的…...

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)

HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...

力扣-35.搜索插入位置

题目描述 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...

ABAP设计模式之---“简单设计原则(Simple Design)”

“Simple Design”&#xff08;简单设计&#xff09;是软件开发中的一个重要理念&#xff0c;倡导以最简单的方式实现软件功能&#xff0c;以确保代码清晰易懂、易维护&#xff0c;并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计&#xff0c;遵循“让事情保…...

2025季度云服务器排行榜

在全球云服务器市场&#xff0c;各厂商的排名和地位并非一成不变&#xff0c;而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势&#xff0c;对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析&#xff1a; 一、全球“三巨头”…...

站群服务器的应用场景都有哪些?

站群服务器主要是为了多个网站的托管和管理所设计的&#xff0c;可以通过集中管理和高效资源的分配&#xff0c;来支持多个独立的网站同时运行&#xff0c;让每一个网站都可以分配到独立的IP地址&#xff0c;避免出现IP关联的风险&#xff0c;用户还可以通过控制面板进行管理功…...

Linux系统部署KES

1、安装准备 1.版本说明V008R006C009B0014 V008&#xff1a;是version产品的大版本。 R006&#xff1a;是release产品特性版本。 C009&#xff1a;是通用版 B0014&#xff1a;是build开发过程中的构建版本2.硬件要求 #安全版和企业版 内存&#xff1a;1GB 以上 硬盘&#xf…...

高防服务器价格高原因分析

高防服务器的价格较高&#xff0c;主要是由于其特殊的防御机制、硬件配置、运营维护等多方面的综合成本。以下从技术、资源和服务三个维度详细解析高防服务器昂贵的原因&#xff1a; 一、硬件与技术投入 大带宽需求 DDoS攻击通过占用大量带宽资源瘫痪目标服务器&#xff0c;因此…...

《信号与系统》第 6 章 信号与系统的时域和频域特性

目录 6.0 引言 6.1 傅里叶变换的模和相位表示 6.2 线性时不变系统频率响应的模和相位表示 6.2.1 线性与非线性相位 6.2.2 群时延 6.2.3 对数模和相位图 6.3 理想频率选择性滤波器的时域特性 6.4 非理想滤波器的时域和频域特性讨论 6.5 一阶与二阶连续时间系统 6.5.1 …...

6.9-QT模拟计算器

源码: 头文件: widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QMouseEvent>QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public QWidget {Q_OBJECTpublic:Widget(QWidget *parent nullptr);…...