Java代理

一、代理模式

代理模式定义:为其他对象提供一种代理以控制对这个对象的访问。

上面类图中有一个订单接口类(OrderService)、一个订单实现类(OrderServiceImpl),订单模块的业务相对复杂和重要,如果这时候要在方法执行前后加上日志,就可以新增一个代理类来实现,而不用改动原来OrderServcieImpl核心业务逻辑代码。

代理模式角色

  • 抽象角色(Subject):声明了目标对象和代理对象共同接口。

  • 具体角色(RealSubject): 代理对象所代表的真实对象。

  • 代理角色(Proxy):代理对象内部含有对真实对象的引用,与真实对象有相同的接口以便在任何时候都可以代替真实对象,同时它可以在执行真实对象操作时附加其它操作。

二、静态代理

静态代理见上面例子

优点:没有侵入原代码

缺点:不同的接口要有不同的代理类实现类就会很冗余。

三、JDK动态代理

在运行时生成动态代理类,是基于Java的反射机制实现。

  • java.lang.reflect.Proxy: 调用newProxyInstance

              得到某一对象的代理对象。

public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

loader:指明生成代理对象使用哪个类装载器。

Class<?>[]: 指明哪个对象的代理对象。

InvocationHandler:指明这个代理对象要做什么事。

  • java.lang.reflect.InvocationHandler:代理实例调用处理程序一个接口。

代码:实现InvocationHandler接口的invoke方法,加入要处理的逻辑,客户端调用时先通过Proxy获取代理类对象。

优点:仅依赖于JDK代码实现简单。

缺点:必须实现接口的业务类才能生成代理对象。

四、CGLIB动态代理

CGLIB是一个强大的代理工具包,被广泛应用于AOP框架中以提供方法拦截操作,它的底层用ASM来操作字节码来生成类,需要注意CGLib与ASM版本的对应关系。

优点:不需要实现接口,可以对类直接进行代理。

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

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

相关文章

SD NAND对比TF卡优势(以CSNP4GCR01-AMW为例)

最近做的一个项目&#xff0c; 需要加大容量存储&#xff0c;这让我想到之前在做ARM的开发板使用的TF卡方案&#xff0c;但是TF卡需要携带卡槽的&#xff0c;但是有限的PCB板布局已经放不下卡槽的位置。 这个时候就需要那种能够不用卡槽&#xff0c;直接贴在板子上面&#xff0…

深度学习_3_实战_房价预测

梯度 实战 代码&#xff1a; # %matplotlib inline import random import torch import matplotlib.pyplot as plt # from d21 import torch as d21def synthetic_data(w, b, num_examples):"""生成 Y XW b 噪声。"""X torch.normal(0,…

【Ubuntu18.04】Livox Tele-15使用教程

Livox Tele-15使用教程 引言1 下载并安装Livox Viewer1.1 打开Livox Viewer程序1.2 设备ip链接 2 览沃Livox SDK二次开发并封装ROS2.1 览沃Livox SDK安装2.2 览沃Livox livox_ros_driver 安装2.3 Launch 配置文件描述 3 保存lvx格式的数据文件3.1 使用览沃Viewer保存lvx文件3.2…

vuecli2关于下载本地取环境变量没问题部署后路径取不到环境变量问题解决

功能 下载功能,用a标签实现下载 代码错误思路分析 解决办法可以忽略直接看下面 解决思路 在每个config文件中都定义了file_url,本地运行没有问题,但是部署到服务器开发环境, 拿到的是生产环境的FILE_URL地址 首先看了流水线-构建配置-编译配置-编译脚本里的打包命令: ** 本…

51单片机KeyWard

eg1&#xff1a; 单片机键盘的分类 键盘分为编码键盘和非编码键盘&#xff0c;键盘上闭合键的识别由专用的硬件编码器实现&#xff0c;并产生键编码号或键值得称为编码键盘&#xff0c;如计算机键盘&#xff0c;而靠软件来识别的称为非编码键盘&#xff0c;在单片机组成的各种…

百度松果20231022作业

越狱 盒子与球 斯特林第二类数&#xff08;用dp求&#xff09;*盒子的阶乘 int dp[11][11]; //n>k int A(int x){int res1;fer(i,2,x1)res*i;return res; } signed main(){IOS;dp[2][1]dp[2][2]dp[1][1]1;fer(i,3,11){dp[i][1]1;fer(j,2,i){dp[i][j]j*dp[i-1][j]dp[i-1][j-…

小程序如何搭建在服务器上

小程序可以通过搭建在服务器上&#xff0c;来实现跨平台的访问和使用。以下是搭建小程序在服务器上的步骤&#xff1a; 安装Node.js&#xff1a;首先&#xff0c;你需要在服务器上安装Node.js。你可以从Node.js的官方网站下载并安装。 安装微信开发者工具&#xff1a;然后&…

简单的代码优化(后端)

上一篇谈了谈简单的前端的优化&#xff0c;这次就以下几点谈谈后端的优化。 书写时常见的。 循环里面不要走IO流。 走IO&#xff0c;是要对硬盘进读写操作的。就结论而言&#xff0c;硬盘的读写速度是低于内存的&#xff0c;比如说硬盘上读一次数据&#xff0c;需要1秒&#…

面试知识储备--打包工具篇(webpack和vite)

1.vite常用配置 常用配置 1.preprocessorOptions 传递给 CSS 预处理器的配置选项 2.PostCSS 也是用来处理 CSS 的&#xff0c;只不过它更像是一个工具箱&#xff0c;可以添加各种插件来处理 CSS 3.resolve.extensions 导入时想要省略的扩展名列表。默认值为 [‘.mjs’, ‘.js’…

Linux shell编程学习笔记13:文件测试运算

*更新记录&#xff1a;20231020 为补充了&#xff08;十五&#xff09;检测文件是否存在并且是一个符号链接 补充了一个例子 Linux Shell 脚本编程和其他编程语言一样&#xff0c;支持算数、关系、布尔、逻辑、字符串、文件测试等多种运算。前面几节我们依次研究了 Linux she…

泰森多边形

泰森多边形 93 泰森多边形又叫沃洛诺伊图&#xff08;Voronoi diagram&#xff09;&#xff0c;得名于Georgy Voronoi&#xff0c;是一组由连接两邻点线段的垂直平分线组成的连续多边形。一个泰森多边形内的任一点到构成该多边形的控制点的距离小于到其他多边形控制点的距离。…

2.3.C++项目:网络版五子棋对战之实用工具类模块的设计

文章目录 一、实用工具类模块&#xff08;一&#xff09;功能 二、设计和封装&#xff08;一&#xff09;日志宏封装&#xff08;二&#xff09;mysql_util封装&#xff08;三&#xff09;Jsoncpp-API封装&#xff08;四&#xff09;file_util封装&#xff08;五&#xff09;st…

C. You Are So Beautiful Codeforces Round 905 (Div. 2)

Problem - C - Codeforces 题目大意&#xff1a;有一个长度为n的数组a&#xff0c;问有多少个子串[l,r]&#xff0c;满足这个子串作为子序列只在a中出现过一次 1<n<1e5;1<a[i]<1e9 思路&#xff1a;我们发现对于从1开始的连续区间&#xff0c;答案都是非递减的&…

Python---练习:while循环案例:猜数字

需求&#xff1a; 计算机从1 ~ 10之间随机生成一个数字&#xff0c;然后提示输入数字&#xff0c;如果我们输入的数字与随机数相等&#xff0c;则提示恭喜你&#xff0c;答对了。如果输入的数字比随机数大&#xff0c;则提示&#xff0c;猜大了。反之&#xff0c;则提示猜小了…

【Python机器学习】sklearn.datasets分类任务数据集

如何选择合适的数据集进行机器学习的分类任务? 选择合适的数据集是进行任何机器学习项目的第一步,特别是分类任务。数据集是机器学习任务成功的基础。没有数据,最先进的算法也无从谈起。 本文将专注于sklearn.datasets模块中用于分类任务的数据集。这些数据集覆盖了各种场…

java读取指定文件夹下的全部文件,并输出文件名,文件大小,文件创建时间

import java.io.IOException; import java.nio.file.*; import java.nio.file.attribute.*; import java.util.ArrayList; import java.util.List; public class Main { public static void main(String[] args) { try { Path startingDir Paths.get("你的目…

【蓝桥每日一题]-动态规划 (保姆级教程 篇10)#方格取数

高能预警&#xff1a;讲了这么久动态规划了&#xff0c;该上点有难度的题吧 目录 题目&#xff1a;方格取数 思路&#xff08;解法一&#xff09;&#xff1a; 解法二&#xff1a; 题目&#xff1a;方格取数 思路&#xff08;解法一&#xff09;&#xff1a; 如果只有两个方向…

React useMemo useCallback useEffect 的区别(保姆级教程)

因个人工作原因&#xff0c;在2023年学起了React TS 这个 “前端大佬” “高阶玩家” 标配的技术栈&#xff0c;一套学习下来个人总结就是&#xff1a;React真特么难用&#xff01;传染病式的渲染逻辑是真让人难受&#xff01;维护之前的代码就是深渊&#xff01;难怪React项目…

SpringMVC的工作流程

1、SpringMVC的定义 Spring MVC是基于Java的开源Web框架&#xff0c;它是Spring框架的一部分&#xff0c;用于构建MVC&#xff08;Model-View-Controller&#xff09;模式的Web应用程序。它提供了一种灵活且强大的方式来开发Web应用程序&#xff0c;并将应用程序的不同层进行解…