对代理模式和动态代理以及AOP的一些理解

代理模式:

代理模式,也叫做静态代理,是一种结构型设计模式,它为其他对象提供了一种代理,以控制对这个对象的访问。

  • 代理模式可以在不修改原有类的情况下,对其功能进行扩展,编译时就确定了代理类的关系,代理类在编译期间生成,必须实现与目标类相同的接口。
  • 需要明确哪些对象有代理对象,在使用的时候需要直接调用代理对象

示例:

public interface Service {void doSomething();}public class RealService implements Service {@Overridepublic void doSomething() {System.out.println("我是真实的实现类");}
}public class ProxyService implements Service{private Service proxyTarget;// 需要指定需要被代理的对象public ProxyService(Service proxyTarget) {this.proxyTarget = proxyTarget;}@Overridepublic void doSomething() {System.out.println("我是代理类");proxyTarget.doSomething();}
}public class Main {public static void main(String[] args) {RealService realService = new RealService();new ProxyService(realService).doSomething();}}

动态代理:

动态代理是在运行时生成代理类的字节码,代理类不需要在编译时实现接口。动态代理主要用于AOP(面向切面编程)等场景,可以在运行时动态地为目标对象创建代理对象。

public interface Service {void execute();
}public class RealService implements Service {@Overridepublic void execute() {System.out.println("Executing service...");}
}public class ServiceInvocationHandler implements InvocationHandler {private Object target;public ServiceInvocationHandler(Object target) {this.target = target;}@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("Before executing " + method.getName());Object result = method.invoke(target, args);System.out.println("After executing " + method.getName());return result;}
}public class DynamicProxyDemo {public static void main(String[] args) {Service realService = new RealService();ServiceInvocationHandler handler = new ServiceInvocationHandler(realService);Service proxyService = (Service) Proxy.newProxyInstance(realService.getClass().getClassLoader(),realService.getClass().getInterfaces(),handler);proxyService.execute();}
}

对比:

实现方式

  • 静态代理:代理类在编译期间生成,需要手动编写代理类。
  • 动态代理:代理类在运行时生成,通过反射机制实现。

灵活性

  • 静态代理:扩展性较差,每个目标类都需要一个对应的代理类。
  • 动态代理:更灵活,可以为任意接口创建代理,适用于AOP等动态需求。

性能

  • 静态代理:性能较高,因为代理类在编译期间生成,没有运行时开销。
  • 动态代理:性能稍差,因为代理类在运行时生成,有一定的反射开销。

总结

代理模式和动态代理各有优劣,具体使用时需要根据需求选择合适的方式。静态代理适用于结构较为简单且明确的场景,而动态代理则适用于需要灵活扩展和动态处理的复杂场景。

对AOP的理解:

  1. aop和ioc其实是一体的,也就是说要实现aop,ioc是不可或缺的,因为我们在使用的时候,希望的是代理对象的这一步操作是透明的,只需要调用原始对象就可以完成代理。
  2. 如果我们使用静态代理来实现aop,会出现一个问题,也就是我们需要显式的去创建代理对象,但是这与我们的期望结果是相悖的,所以在spring中,在Spring中,依赖注入的底层是一个 Map<String, BeanDefinition>,其中 BeanDefinition 存放了Bean的配置信息,包括Bean的类类型、作用范围、初始化方法等。当一个Bean需要代理时,Spring会在 BeanDefinition 中将 Instance 初始化为代理对象,这样在进行依赖注入时,注入的就是一个代理对象。
  3. 当Spring IoC容器创建Bean时,会检查是否有AOP增强的配置。如果有,则通过AOP配置创建代理对象,而不是直接创建原始对象。

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

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

相关文章

【JavaEE】多线程代码案例(1)

&#x1f38f;&#x1f38f;&#x1f38f;个人主页&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;JavaEE专栏&#x1f38f;&#x1f38f;&#x1f38f; &#x1f38f;&#x1f38f;&#x1f38f;上一篇文章&#xff1a;多线程&#xff08;2…

leetcode每日一练:顺序表OJ题

第一题&#xff1a;移除元素 题目要求&#xff1a;给一个数组nums和一个值val&#xff0c;你需要 原地 移除所有所有数值等于val的元素&#xff0c;并返回移除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须仅使用0(1)的额外空间并 原地 修改输入数组。 元素的顺序…

【Tools】AIGC:人工智能生成内容的新时代

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 &#x1f3b5; 王心凌《那年夏天宁静的海》 随着人工智能&#xff08;AI&#xff09;技术的…

三生随记——午夜咖啡馆

在城市的边缘&#xff0c;隐藏着一间古老的咖啡馆——“午夜咖啡馆”。它的外观不起眼&#xff0c;却总能在夜晚吸引那些寻找安宁或寻求刺激的顾客。据说&#xff0c;咖啡馆的老板是一位年长的绅士&#xff0c;他的脸上总是挂着神秘莫测的微笑。 艾米是一名作家&#xff0c;常常…

基于weixin小程序智慧物业系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;员工管理&#xff0c;房屋管理&#xff0c;缴费管理&#xff0c;车位管理&#xff0c;报修管理 工作人员账号功能包括&#xff1a;系统首页&#xff0c;维…

使用electron打包Vue前端项目的详细流程

使用electron打包Vue前端项目的详细流程 需要更改的东西 路由模式的修改 # 修改前&#xff1a;url不带#mode: history# 修改后&#xff1a;url带#mode: hash全局修改Cookies为localStorage 由于打包成exe或deb这类可执行文件后&#xff0c;本地是没有 Cookies 全局搜索Cooki…

Android Studio环境搭建(4.03)和报错解决记录

1.本地SDK包导入 安装好IDE以及下好SDK包后&#xff0c;先不要管IDE的引导配置&#xff0c;直接新建一个新工程&#xff0c;进到开发界面。 SDK路径配置&#xff1a;File---->>Other Settings---->>Default Project Structure 拷贝你SDK解压的路径来这&#xff0c;…

ros笔记01--初次体验ros2

ros笔记01--初次体验ros2 介绍安装ros2测试验证ros2说明 介绍 机器人操作系统(ROS)是一组用于构建机器人应用程序的软件库和工具。从驱动程序和最先进的算法到强大的开发者工具&#xff0c;ROS拥有我们下一个机器人项目所需的开源工具。 当前ros已经应用到各类机器人项目开发中…

ORACLE 、达梦 数据库查询指定库指定表的索引信息

在Oracle数据库中&#xff0c;索引是一种关键的性能优化工具&#xff0c;通过它可以加快数据检索速度。在本文中&#xff0c;我们将深入探讨如何详细查询指定表的索引信息&#xff0c;以及如何利用系统视图和SQL查询来获取这些信息。 索引在数据库中的重要性 索引是一种数据结…

操作符详解(下) (C语言)

操作符详解下 操作符的属性1.优先级2.结合级 表达式求值1.整型提升2.如何进行整形提升呢&#xff1f;3.算术转换4.问题表达式解析 操作符的属性 C语言的操作符有2个重要的属性&#xff1a;优先级、结合性&#xff0c;这两个属性决定了表达式求值的计算顺序。 1.优先级 优先级…

问题:第一次世界大战的起止时间是 #其他#学习方法#微信

问题&#xff1a;第一次世界大战的起止时间是 A.1913 ~1918 年 B.1913 ~1918 年 C.1914 ~1918 年 D.1914 ~1919 年 参考答案如图所示

RabbitMQ 进程内流控(Flow Control) 源码解析

1. 概述 1.1 为什么要流控&#xff1f; 流控主要是为了防止生产者生产消息速度过快&#xff0c;超过 Broker 可以处理的速度。这时需要暂时限制生产者的生产速度&#xff0c;让 Broker 的处理能够跟上生产速度。 Erlang进程之间不共享内存&#xff0c;每个进程都有自己的进程邮…

42.HOOK引擎核心代码

上一个内容&#xff1a;41.HOOK引擎设计原理 以 40.设计HOOK引擎的好处 它的代码为基础进行修改 主要做的是读写寄存器 效果图 添加一个类 htdHook.h文件中的实现 #pragma once class htdHook { public:htdHook(); };htdHook.cpp文件中的实现&#xff1a; #include "…

独辟蹊径:我是如何用Java自创一套工作流引擎的(下)

作者&#xff1a;后端小肥肠 创作不易&#xff0c;未经允许严禁转载。 姊妹篇&#xff1a;独辟蹊径&#xff1a;我是如何用Java自创一套工作流引擎的&#xff08;上&#xff09;_java工作流引擎-CSDN博客 1. 前言 在上一篇博客中&#xff0c;我们详细介绍了如何利用Java语言从…

LC437.路径总和Ⅲ、LC207.课程表

给定一个二叉树的根节点 root &#xff0c;和一个整数 targetSum &#xff0c;求该二叉树里节点值之和等于 targetSum 的 路径 的数目。 路径 不需要从根节点开始&#xff0c;也不需要在叶子节点结束&#xff0c;但是路径方向必须是向下的&#xff08;只能从父节点到子节点&am…

【每日刷题】Day77

【每日刷题】Day77 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. LCR 159. 库存管理 III - 力扣&#xff08;LeetCode&#xff09; 2. LCR 075. 数组的相对排序 - 力…

代理ip匿名原理

代理IP匿名的原理基于代理服务器的工作方式。当用户使用代理服务器访问互联网时&#xff0c;请求数据会先发送到代理服务器&#xff0c;然后由代理服务器再向目标服务器发送请求。在这个过程中&#xff0c;代理服务器会将用户真实IP地址替换成代理服务器的IP地址&#xff0c;从…

Linux——passwd文件,grep,cut

/etc/passwd文件含义 作用 - 记录用户账户信息&#xff1a;共分为7段&#xff0c;使用冒号分割 含义 - 文件内容意义&#xff1a;账户名&#xff1a;密码代号x&#xff1a;UID&#xff1a;GID&#xff1a;注释&#xff1a;家目录&#xff1a;SHELL - 第7列/sbin/nologin&#x…

c++(三)

1. STL 1.1. 迭代器 迭代器是访问容器中元素的通用方法。如果使用迭代器&#xff0c;不同的容器&#xff0c;访问元素的方法是相同的&#xff1b;迭代器支持的基本操作&#xff1a;赋值&#xff08;&#xff09;、解引用&#xff08;*&#xff09;、比较&#xff08;和!&…

隐私计算实训营第二期第11讲组件介绍与自定义开发

首先给大家推荐一个博主的笔记&#xff1a;隐语课程学习笔记11- 组件介绍与自定义开发-CSDN博客 官方文档&#xff1a;隐语开放标准介绍 | 开放标准 v1.0.dev240328 | 隐语 SecretFlow 01 隐语开放标准 隐语开放标准是为隐私保护应用设计的协议栈。 目前&#xff0c;隐语开…