Spring的两种代理方式:JDK动态代理和CGLIB动态代理

2023-11-18

代理模式

代理模式的英文叫做Proxy或Surrogate,中文都可译为”代理“,所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用
A. 抽象主题角色
声明了真实主题和代理主题的共同接口,这样一来在任何可以使用真实主题的地方都可以是使用代理主题
B. 代理主题(Proxy)角色:
代理主题角色内部含有对真实主题的引用,从而可以在任何时候操作真实主题对象;代理主题角色提供一个与真实主题角色相同的接口,以便可以在任何时候都可以替代真实主题控制对真实主题的引用,负责在需要的时候创建真实主题对象(和删除真实主题对象);代理角色通常在将客户端调用传递给真实的主题之前或之后,都要执行某个操作,而不是单纯地将调用传递给真实主题对象。
C. 真实主题角色
定义了代理角色所代表地真实对象
这里写图片描述

这里写图片描述

例如:
这里写图片描述

这里写图片描述

用动态代理模式重构

这里写图片描述

JDK动态代理

这里写图片描述

这里写图片描述

目标类
拦截器
代理类

总结:1、因为利用JDKProxy生成的代理类实现了接口,所以目标类中所有的方法在代理类中都有。
2、生成的代理类的所有的方法都拦截了目标类的所有的方法。而拦截器中invoke方法的内容正好就是代理类的各个方法的组成体。
3、利用JDKProxy方式必须有接口的存在。
4、invoke方法中的三个参数可以访问目标类的被调用方法的API、被调用方法的参数、被调用方法的返回类型。

用JDK动态代理模式重构

这里写图片描述

用JDK动态代理模式重构hibernate事务

这里写图片描述

cglib动态代理

1、 CGlib是一个强大的,高性能,高质量的Code生成类库。它可以在运行期扩展Java类与实现Java接口。
2、 用CGlib生成代理类是目标类的子类。
3、 用CGlib生成 代理类不需要接口
4、 用CGLib生成的代理类重写了父类的各个方法。
5、 拦截器中的intercept方法内容正好就是代理类中的方法体

这里写图片描述

这里写图片描述

用cglib动态代理模式重构hibernate事务

这里写图片描述

spring两种代理方式

  1. 若目标对象实现了若干接口,spring使用JDK的java.lang.reflect.Proxy类代理。
    优点:因为有接口,所以使系统更加松耦合
    缺点:为每一个目标类创建接口
  2. 若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。
    优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。
    缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring的两种代理方式:JDK动态代理和CGLIB动态代理 的相关文章

随机推荐

  • 2023年第二届计算与人工智能国际会议(ISCAI 2023)

    会议简介 Brief Introduction 2023年第二届计算与人工智能国际会议 ISCAI 2023 会议时间 2023年10月13 15日 召开地点 中国 上海 大会官网 www iscai org 2023年第二届计算与人工智能
  • 机器学习之基础知识(全)

    目录 1 机器学习概述 1 1 人工智能概述 1 1 1 人工智能使用场景 1 1 2 人工智能小案例 1 2 人工智能发展历程 1 2 1 图灵测试 1 2 2 发展历程 1 2 3 小结 1 3 人工智能主要分支 1 3 1 人工智能
  • RxJS新手入门

    文章目录 1 介绍 2 核心概念 3 基本运作过程 4 RxJS 如何通过运算符过滤资料 5 RxJS 主体物件 Subject 的用法 6 弹珠图 7 如何选择运算符 1 介绍 RxJS 是什么 用一句话类概括就是 RxJS 是用于 Ja
  • Kali Linux没有无线网卡?玩个锤纸~

    Kali Linux没有无线网卡 玩个锤纸 一 USB无限网卡 使用Kali linux 先准备好一个适合Kali系统的USB外置无限网卡 注意内置网卡并不适合渗透测试 Linux系统的指令相对于一般人来说比较晦涩难懂 最好选择免驱动类型
  • 基于Servlet-API型JAVA内存马(filter型、servlet型、listener型)

    前言 常规的木马实际写出落地后容易被检查出来 并且webshell被发现后也就导致我们的行动被发现 很容易造成木马被查杀 利用漏洞被修复 使我们的攻击变得更加艰难 所以内存马的出现与利用无疑是增强了隐蔽性 可以让我们的攻击更加稳定 持久 而
  • eclipse创建web service全过程

    创建Web Service步骤 一 创建服务端工程 1 WebServerTest web 工程 File New Other 选择Dynamic Web Project 配置Tomcat服务器 点击Browse选择Tomcat所在目录 点
  • Anaconda常用命令

    文章目录 一 简介 二 常用命令 2 1管理环境 2 2管理包 三 实践 参考 一 简介 Anaconda是Python环境和包的管理工具 可以给Python创建环境 并在创建的环境中添加需要的包 二 常用命令 Windows打开 Anac
  • 南方科技大学计算机学科评估,全国第四轮学科评估结果公布 我校7个学科进入B类...

    原标题 全国第四轮学科评估结果公布 我校7个学科进入B类 近日 教育部学位与研究生教育发展中心公布了全国第四轮学科评估结果 我校25个参评学科有13个上榜 其中 7个学科进入B类 6个学科进入C类 入选学科数位居省属高校第4位 学科评估是教
  • 基于LU分解的矩阵求逆

    import numpy as np import sys def LU deco inverse m dim m shape 0 E np mat np eye dim L np mat np eye dim U m copy for i
  • 无偏估计的数学证明和分析

    最近学习PCA 在求最大化方差 2 1 P 1
  • 自动化测试高频面试题-90%可能会被问到

    Hello 你们的好朋友九九又又又来了 今天猜猜我给大家带来点啥干货呢 最近很多小伙伴出去面试的时候经常会被问到跟自动化测试相关的面试题 所以 今天九九特意给大家整理了一些经常被公司问到的自动化测试相关的面试题 停 咱先收藏起来好吗 别到时
  • js中过一段时间后终止while循环,防止死循环的方法

    今天发现了一个比较有趣的事 相信很多人遇到过写while循环时 在测试时很容易陷入死循环 导致要关闭页面再重启才能继续测试 那如果频繁调试 就每死循环一次就重启一次 很烦 所以想写一个到一定时间就终止循环的函数 刚开始用setTimeout
  • rhel8订阅注册激活

    先注册账号进行订阅 注册系统 https www howtoing com enable rhel subscription in rhel 8
  • JDK1.8的新特性(详细总结)

    目录 前言 一 jdk8简介 二 Lambda表达式语法 函数式接口 三 jdk8 内置四大核心函数接口 消费型接口 海王式接口 只知道索取 供给型接口 舔狗式接口 只知道付出 不索取回报的 函数型接口 双向奔赴 有输入有输出 断言型接口
  • C语言上机实验思路分享5

    实验内容 方法和步骤 1 编写一个函数 由实参传来一个整数n 将它各个位上的数字逆序输出 例如输入 123 输出为321 2 求方程ax 2 bx c O的根 用3个函数分别求当 b 2 4ac大于0 等于0和小于0时的根 并输出结果 从主
  • js使用AjaxFileupload插件实现文件上传

    最近做项目 需要上传表单元素中的文件POST到目标URL 并把得到的数据显示到本页面上 而不跳转到目标URL 那么 现在就要明确两件事 1 不能直接提交表单 因为一旦点击submit就会自动跳转到action界面 2 可以选择ajax进行异
  • Spring boot 整合 log4j2日志、程序异常,发送邮件通知

    官方文档 https logging apache org log4j 2 x 1 Maven修改如下
  • html 元素平滑滚动到某一位置

    在网上查了大半天 有人用高度算 然后setTimeout的 那个观感真的是差到家了 还有人说用 js动画库的 其实很简单 直接用window scrollTo 这个方法就完事了 回到顶部 window scrollTo top 0 beha
  • 【Java】5大排序算法总结(插入排序+希尔排序+选择排序+堆排序+冒泡排序)

    快速导航 1 稳定性 2 插入排序 3 希尔排序 4 选择排序 5 堆排序 6 冒泡排序 1 稳定性 两个相等的数据 如果经过排序后 排序算法能保证其相对位置不发生变化 则我们称该算法是具备稳定性的排序算法 图中排序后a仍然在b前面 此时这
  • Spring的两种代理方式:JDK动态代理和CGLIB动态代理

    代理模式 代理模式的英文叫做Proxy或Surrogate 中文都可译为 代理 所谓代理 就是一个人或者一个机构代表另一个人或者另一个机构采取行动 在一些情况下 一个客户不想或者不能够直接引用一个对象 而代理对象可以在客户端和目标对象之间起