(十四)Spring之回顾代理模式

news2024/11/15 8:27:38

文章目录

  • 回顾代理模式
  • 动态代理常用技术
    • CGLIB动态代理技术

上一篇:(十三)Spring之JdbcTemplate

回顾代理模式

参考:代理模式Proxy Pattern
不用JDK的动态代理,手写JDK动态代理

动态代理常用技术

在程序运行阶段,在内存中动态生成代理类,被称为动态代理,目的是为了减少代理类的数量。解决代码复用的问题。
在内存当中动态生成类的技术常见的包括:

  • JDK动态代理技术:只能代理接口。参考代理模式Proxy Pattern
  • CGLIB动态代理技术:CGLIB(Code Generation Library)是一个开源项目。是一个强大的,高性能,高质量的Code生成类库,它可以在运行期扩展Java类与实现Java接口。它既可以代理接口,又可以代理类,底层是通过继承的方式实现的。性能比JDK动态代理要好。(底层有一个小而快的字节码处理框架ASM。)
  • Javassist动态代理技术:Javassist是一个开源的分析、编辑和创建Java字节码的类库。是由东京工业大学的数学和计算机科学系的Shigeru Chiba (千叶 滋)所创建的。它已加入了开放源代码JBoss应用服务器项目,通过使用Javassist对字节码操作为JBoss实现动态"AOP"框架。
    参考动态生成类–javassist的使用

CGLIB动态代理技术

CGLIB既可以代理接口,又可以代理类。底层采用继承的方式实现。所以被代理的目标类不能使用final修饰。
使用CGLIB,需要引入它的依赖:

<dependency>
  <groupId>cglib</groupId>
  <artifactId>cglib</artifactId>
  <version>3.3.0</version>
</dependency>

使用CGLIB代理类
创建一个目标类:

/**
 *  目标类,不是接口了
 */
public class TargetClass{

    public void sayHi(){
        System.out.println("Hi,动态 CGLEIB proxy");
    }
}

创建一个调用处理器类:
在CGLIB当中不是InvocationHandler接口,是方法拦截器接口:MethodInterceptor
实现的不是invoke方法了,是intercept方法
intercept有一个目标对象的值,所以这个类不需要依赖目标对象了
intercept方法有四个参数:

  • target:目标对象

  • method:目标方法

  • objects:目标方法参数

  • methodProxy:代理方法

public class ProxyClass implements MethodInterceptor {



    /**
     *
     * @param target 目标对象
     * @param method 目标方法
     * @param objects 目标方法参数
     * @param methodProxy 代理方法
     * @return 代理类
     * @throws Throwable
     */
    @Override
    public Object intercept(Object target, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {
        //方法调用之前功能增强
        System.out.println("目标方法执行前。。。。");
        Object result = methodProxy.invokeSuper(target,objects);//该方法真正调用目标方法
        //方法调用之后功能增强
        System.out.println("目标方法执行后。。。。");
        return result;
    }
}

编写测试程序:
使用CGLIB在内存中为目标类生成代理类,并创建对象,有以下几个步骤:

  • 1.创建字节码增强器对象Enhancer
    这个对象是CGLIB库当中的核心对象,需要依靠它来生成代理类

  • 2.调用setSuperclass方法设置目标类/接口

  • 3.调用setCallback方法设置回调(等同于JDK动态代理当中的调用处理器InvocationHandler)

  • 4.调用create方法创建代理对象
    这一步会做两件事:

    • 其一:在内存中生成目标/接口的子类,其实就是代理类的字节码。
    • 其二:创建代理对象
public class Client {
    public static void main(String[] args) {
        //1.创建字节码增强器对象
        Enhancer enhancer = new Enhancer();
        //2.设置目标类/接口
        enhancer.setSuperclass(TargetClass.class);
        //3.设置回调(等同于JDK动态代理当中的调用处理器InvocationHandler)
        enhancer.setCallback(new ProxyClass());
        //4.创建代理对象
        TargetClass targetClass = (TargetClass)enhancer.create();
        targetClass.sayHi();
    }
}

运行程序:出现错误
请添加图片描述
原因是jdk8版本之后有了java.base这个包,jdk8版本之前没有,导致找不到。
需要加这两个参数
–add-opens java.base/java.lang=ALL-UNNAMED
–add-opens java.base/sun.net.util=ALL-UNNAMED
第一步:点击右上方进行编辑配置
在这里插入图片描述
第二步:点击修改选项,勾选添加VM选项
在这里插入图片描述
第三步:添加两个参数,保存
请添加图片描述
再次运行:运行成功
请添加图片描述

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

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

相关文章

CentOS 7 手动安装OpenStack

官网文档 因为之前已经在 Ubuntu 20.04 下完成了 Ubuntu 20.04 手动安装OpenStack &#xff0c;最后&#xff0c;想要学习 OVN 的时候&#xff0c;发现 ubuntu 上的 OVN 安装很复杂&#xff0c;没有 TripleO/RDO based deployments &#xff0c;所以&#xff0c;又在 CentOS 7…

项目开源!基于PaddleDetection打造实时人体姿态检测的多关节控制皮影机器人

本文已在【飞桨PaddlePaddle】公众号平台发布&#xff0c;详情请戳链接&#xff1a;项目开源&#xff01;基于PaddleDetection打造实时人体姿态检测的多关节控制皮影机器人 皮影戏是一种以兽皮或纸板做成的人物剪影以表演故事的民间戏剧&#xff0c;皮影一般由头、躯干&#x…

2003-2019年各省市场分割指数全步骤数据+最终结果

2003-2019年市场分割指数 1、时间&#xff1a;2003-2019年 2、数据包含&#xff1a;31各省份市场分割指数全步骤数据和最终结果 3、具体内容&#xff1a;市场分割指数差分形式相对价格、市场分割指数去均值、市场分割指数方差、市场分割指数最终结果。 4、指标说明&#xf…

vue3 框架学习概念笔记

文章目录前情提要框架设计概览命令式声明式小结虚拟dom性能运行时和编译时框架设计核心要素声明式描述UI渲染器组件的本质vue.js模板响应式系统概念完善的响应式系统响应式系统的调度计算属性Computedwatch 原理竞态问题非原始值的响应式方案javaScript 对象原始值的响应式方案…

毕业后河北种水稻 国稻种芯·中国水稻节:安徽姑娘承德务农

毕业后河北种水稻 国稻种芯中国水稻节&#xff1a;安徽姑娘承德务农 (新华每日电讯记者刘金海、方欣、牟宇) 新闻中国采编网 中国新闻采编网 谋定研究中国智库网 中国农民丰收节国际贸易促进会 国稻种芯中国水稻节 中国三农智库网-功能性农业农业大健康大会报道&#xff1a;整…

【Linux】内存查看vmstat命令(虚拟内存统计)

vmstat命令&#xff1a;虚拟内存统计 CPU使用率内存试用虚拟内存交换情况IO读写情况 process r&#xff1a;运行和等待CPU时间片的进程数 超过cpu个数&#xff0c; 出现CPU瓶颈 长时间大于1&#xff0c;CPU不足&#xff0c;需要增加CPU b&#xff1a;正在等待资源的进程数&…

玩转MySQL:定位排查解决突发Bug

引言 前面MySQL优化、调化两文中&#xff0c;聊到了关于数据库性能优化的话题&#xff0c;而本文则再来聊一聊关于MySQL线上排查方面的话题。线上排查、性能优化等内容是面试过程中的“常客”&#xff0c;而对于线上遇到的“疑难杂症”&#xff0c;需要通过理性的思维去分析问…

Java岗位必备技能SpringBoot的面试题集锦

当下SpringBoot框架真的很火&#xff0c;大多数企业把它作为基础技能&#xff0c;考察求职者的能力。如下截图&#xff0c;是我从Boss直聘中找到的&#xff0c;要求SpringBoot是必备技能。 所以非常有必要为了面试&#xff0c;好好归纳下SpringBoot常被提起来的问题。 题目大纲…

Tesseract .Net SDK C# OCR 2022.1

Tesseract .Net SDK C# OCR 库 #将扫描的 PDF 转换为可搜索的文档 #快速准确的基于神经网络的引擎 #纠正低质量扫描 # 120 多种语言 # .Net 2.0, .Net 5, 标准, 核心 Tesseract OCR - industry-fastest .Net OCR library 4 行代码&#xff0c;仅此而已 var api OcrApi.Creat…

[附源码]java毕业设计疫情环境下的酒店管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

不知道什么的复习题

P4408 [NOI2003] 逃学的小孩&#xff0c;一眼就看出要化简题面&#xff1a;不就是找三个点使得ABBC最大嘛&#xff0c;不妨想起直径的性质&#xff0c;最长&#xff0c;而且其他点到它的距离最长。那么直接拿直径来做就行。推导出结论为ansmax(min(dis[A][k],dis[B][k])dis[A][…

CSS3------CSS选择器

界面中的“超文本“本质上就是通过一个一个矩形盒子包起来&#xff0c;然后进行排版组合&#xff0c;那么接下来要详细研究这个标签盒子的细节结构&#xff0c;以帮助学习如何使用它&#xff0c;但是在开始研究它之前&#xff0c;我们先来了解一个概念&#xff0c;选择器的概念…

BN、CBN、CmBN 的对比与总结

BN、CBN、CmBN 的对比与总结 最近看到了关于 Yolo 系列 trick 的总结文章 【Make YOLO Great Again】YOLOv1-v7全系列大解析&#xff08;Tricks篇&#xff09;&#xff0c;其中提到了 YoloV4 中使用了 CmBN&#xff0c;这是对 CBN 的改进&#xff0c;可以较好的适应小 batch 的…

电容笔值不值得买?电容笔十大品牌排行

要想给我们的ipad配置一款电容笔&#xff0c;如果感觉苹果原装的电容笔价格远远超过预算。这时候平替电容笔是个非常值得入手的选择。试想一下购买一款苹果原装的电容笔的资金都够买整整四款平替电容笔了&#xff0c;平替电容笔价格便宜且功能跟苹果的电容笔相差无几。下面我来…

【设计模式】 - 结构型模式 - 迭代器模式

目录标题前言迭代器模式概述结构实现优缺点JDK源码解析前言 行为型模式用于描述程序在运行时复杂的流程控制&#xff0c;即描述多个类或对象之间怎样相互协作共同完成单个对象都无法单独完成的任务&#xff0c;它涉及算法与对象间职责的分配。 行为型模式分为类行为模式和对象…

ai绘画有哪些软件,盘点三款免费且超级好用的AI绘画工具

Ai绘画有哪些软件&#xff1f;不但可以免费使用&#xff0c;而且生成的画作精美&#xff0c;而且生成的图片速度还要很快&#xff1f; 不用急&#xff0c;今天小编给大家推荐的这三款ai绘画工具完全满足了上述条件&#xff01; 第一款&#xff0c;重磅级产品&#xff0c;数画…

内存 地址转换、分段、空闲空间管理

目录 1. 地址转换 1.1 动态重定位 1.1.1 基址寄存器&#xff08;虚拟地址 -> 物理地址) 1.1.2 界限寄存器&#xff08;提供访问保护&#xff09; 1.2 操作系统的工作 2. 分段 2.1 分段&#xff1a;泛化的基址/界限 2.2 引用哪个段 2.3 代码和堆的地址转换举例 2.4…

Java#23(常见API--1)

目录 一.Math Math是一个帮助我们用于进行数学计算的工具类 工具类的特点: Math类中的常用方法 二.System System是一个工具类,为我们提供一些与系统相关的办法 一.Math Math是一个帮助我们用于进行数学计算的工具类 工具类的特点: 私有化构造方法,所有的方法都是静态的 M…

[附源码]java毕业设计医院预约挂号管理系统

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

web网页设计期末课程大作业 我的美丽家乡盐城 HTML+CSS+JavaScript

家乡旅游景点网页作业制作 网页代码运用了DIV盒子的使用方法&#xff0c;如盒子的嵌套、浮动、margin、border、background等属性的使用&#xff0c;外部大盒子设定居中&#xff0c;内部左中右布局&#xff0c;下方横向浮动排列&#xff0c;大学学习的前端知识点和布局方式都有…