Javaee Spring的AOP简介

news2024/11/15 21:52:54

.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 {

    @Override
    public void sing() {
        System.out.println("jinlian在唱歌");
    }
}
-------------------------------------------
package wwx.test02;

public class WangPo implements Sing{

    JinLian jinLian;

    public WangPo(JinLian jinLian) {
        this.jinLian = jinLian;
    }

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

    @Override
    public 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() {
                    @Override
                    public 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. 测试代码

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

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

相关文章

人工智能论文的风格特点

搞清楚AI领域论文的风格特点是写出一篇高质量AI论文的前提&#xff0c;AI领域的论文有如下显著特点。 1. 论文的架构非常清晰且富有逻辑。一篇高质量的AI论文&#xff0c;读者通过大致扫一眼论文的各级标题就能够对论文的写作思路形成清晰的认识&#xff0c;明白论文各部分之间…

防火墙日志取证及分析

防火墙日志取证 网络安全解决方案的主要目的是保护网络免受攻击。它应监视安全事件并实时提醒&#xff0c;以帮助管理员尽快采取补救措施。此外&#xff0c;您需要深入的信息来分析任何漏洞的根本原因、攻击事件重建和用户活动;这就是取证日志分析的用武之地。 取证日志分析软…

广州蓝景分享—遇到网页慢,我们该怎么办?

前言 移动互联网时代&#xff0c;用户对于网页的打开速度要求越来越高。首屏作为直面用户的第一屏&#xff0c;其重要性不言而喻。优化用户体验更是我们前端开发非常需要 focus 的东西之一。 从用户的角度而言&#xff0c;当打开一个网页&#xff0c;往往关心的是从输入完网页…

计算机:理解操作系统:内存篇(中)

内存 1.堆和栈的本质是什么2. java、Python等内存模型3. java内存模型3.1 java中堆和栈是如何实现的 4. Python内存模型 什么是内存 C/C内存模型 堆区与栈区的本质 Java、Python等内存模型 Java内存模型 Jave中的堆区与栈区是如何实现的 Python内存模型 指针与引用 进程的内存…

企业网站架构部署与优化 LNMP

【安装 Nginx 服务】 systemctl stop firewalld systemctl disable firewalld setenforce 0 1、安装依赖包 yum -y install pcre-devel zlib-devel gcc gcc-c make 2、创建运行用户 useradd -M -s /sbin/nologin nginx 3、编译安装 cd /opt tar zxvf nginx-1.12.0.tar.gz -C …

Apifox软件的基础使用方式

Apifox软件的基础使用方式 简单方便的用途 该工具是接口在线调试工具&#xff0c;这里我给到连接供大家去官网下载&#xff0c;我个人觉得是比较于postman工具好用&#xff0c;提供的语言操作是中文版本的便于操作 下载和安装 https://apifox.com/?utm_sourcebaidu&ut…

【超详细】【YOLOV8使用说明】一套框架解决CV的5大任务:目标检测、分割、姿势估计、跟踪和分类任务【含源码】

目录 1.简介2.环境安装2.1安装torch相关库2.2 获取yolov8最新版本&#xff0c;并安装依赖 3. 如何使用模型用于各种CV任务3.1 目标检测任务实现检测图片代码检测视频代码 3.2 分割任务实现分割图片代码分割视频代码 3.3 追踪任务3.4 姿态检测任务姿态检测&#xff08;图片&…

27.Linux网络编程 掌握三次握手建立连接过程掌握四次握手关闭连接的过程掌握滑动窗口的概念掌握错误处理函数封装实现多进程并发服务器实现多线程并发服务器

基本概念叫协议 什么叫协议? 协议是一个大家共同遵守的一个规则&#xff0c; 那么在这个网络通信当中&#xff0c;其实就是双方通信和解释数据的一个规则&#xff0c;这个概念 你也不用记&#xff0c;你只要心里明白就可以了&#xff0c; 分层模型&#xff0c; 物数网传会表应…

Tensorflow GPU 版本安装教程

非常详细的 Tensorflow GPU 版本安装教程 一、安装Anaconda二、TensorFlow GPU 一、安装Anaconda 这一步比较简单&#xff0c;也没有太多的需要注意的&#xff0c;去官网下载即可&#xff1a; 官网地址如下&#xff1a; https://www.anaconda.com/blog/individual-edition-2…

百家云在人工智能领域再有新动作,发布应用于多个行业的AIGC解决方案

4月17日消息&#xff0c;音视频SaaS上市公司百家云&#xff08;股票代码&#xff1a;RTC&#xff09;今日宣布&#xff0c;公司将正式推出应用于多个垂直行业及场景的人工智能生成内容及视频解决方案。 百家云总裁马义表示&#xff0c;此次发布的解决方案&#xff0c;将在极短…

谷歌SEO优化技巧方法

谷歌SEO排名对于许多公司和个人来说都非常重要。随着谷歌成为人们搜索信息的首选&#xff0c;拥有良好的谷歌排名可以帮助我们的网站在搜索引擎中展现出更高的可见度&#xff0c;吸引更多的访问量和潜在客户。优化谷歌SEO排名需要一定的时间和专业知识&#xff0c;无法一蹴而就…

Vulnhub项目:Lin.Security(Linux提权大合集)

靶机地址&#xff1a;linsecurity 靶机描述了用户名和密码 用户名&#xff1a;bob、密码&#xff1a;secret 登录后看到了IP地址&#xff0c;或者在kali上像之前那样进行ip收集&#xff0c;端口收集 开放的端口有很多&#xff0c;从22端口开始&#xff0c;知道用户名和密码&…

供水管网爆管预测模型研究现状

配水管网是供水系统中最昂贵的组成部分。管网运行管理和调度技术难度高&#xff0c;爆管事故 容易发生&#xff0c;对人民生活、工业生产、城市交通及社会安定造成不利影响&#xff0c;造成严重的经济损 失。合理的管道的修复更新计划是满足供水目标、实现对管网的科学管理的重…

回炉重造五--软件管理

1.软件管理 1.1软件包中的文件分类 二进制文件库文件配置文件帮助文件 1.2包查询–rpm -a&#xff1a;所有包 -p:针对尚未安装的程序包文件做查询工作 -l:查看指定的程序包安装后生成的所有文件 -i:查看包的信息 #常用的查询方法 -qa/q/qi2、yum和dnf 2.1 yum/dnf工作原理…

数据库基础篇 《5. 排序与分页》

目录 1. 排序数据 1.1 排序规则 1.2 单列排序 1.3 多列排序 2. 分页 2.1 背景 2.2 实现规则 2.3 拓展 1. 排序数据 1.1 排序规则 使用 ORDER BY 子句排序 ASC &#xff08; ascend &#xff09; : 升序 DESC &#xff08; descend &#xff09; : 降序 ORDER …

【Java 数据结构】栈的实现及相关OJ题

&#x1f389;&#x1f389;&#x1f389;点进来你就是我的人了 博主主页&#xff1a;&#x1f648;&#x1f648;&#x1f648;戳一戳,欢迎大佬指点!人生格言&#xff1a;当你的才华撑不起你的野心的时候,你就应该静下心来学习! 欢迎志同道合的朋友一起加油喔&#x1f9be;&am…

Flutter 通过 VS code 连接 Android 模拟器(Windows)

环境配置 Flutterhttps://flutter.cn/docs/get-started/install/windowsAndroid Studiohttps://developer.android.google.cn/studioVS code安装Flutter插件https://flutter.cn/docs/get-started/editor?tabvscode夜神模拟器https://www.yeshen.com 注意事项 Flutter安装之…

第五章_Redis事务

是什么 官网 能做什么 一个队列中&#xff0c;一次性、顺序性、排他性的执行一系列命令 Redis事务 VS 数据库事务 1 单独的隔离操作 Redis的事务仅仅是保证事务里的操作会被连续独占的执行&#xff0c;redis命令执行是单线程架构&#xff0c;在执行完事务内所有指令前是不可…

【浅学 Linux】

浅学 Linux 一、 Linux1. 目录2. 虚拟机的设置2.1 克隆与快照 3.系统与设置命令3.1 用户相关命令3.2 用户组3.3 管理用户组内成员3.4 日期管理3.5 显示用户3.6 id命令&sudo命令3.7 进程相关的命令top 查看进程ps 查看进展kill 杀死进程 4. Linux目录管理4.1 关机与重启命令…

RIP协议(路由信息协议)简介

一.动态路由简介 1.动态相对静态路由来说&#xff0c;找路更灵活&#xff0c;相互传递 2.分类&#xff1a; 二.RIP协议简介 1.三个版本RIPV1和RIPV2 (在IPV4中使用)&#xff0c; RIPNG (在IPV6中使用) 2.原理简介 三.配置 1.启用Rip 并指定进程ID (进程ID 只具有本地意义…