Spring底层原理(六)

news2024/10/7 20:31:52

Spring底层原理(六)

本章内容

介绍AOP的实现方式、JDK代理的模拟实现与源码

AOP的实现方式
  • 使用代理模式

    • jdk动态代理
    • cglib动态代理
  • 使用aspectj的编译器,该编译器会直接对字节码进行修改,可以实现静态方法增强

    在这里插入图片描述

  • 使用javaagent,在jvm option中指定-javaagent:aspectjweaver.jar,它会在字节码加载阶段对方法进行织入

JDK动态代理的模拟实现
public interface InvocationHandler {
    /**
     * @param proxy  代理对象
     * @param method 调用的方法
     * @param args   方法参数
     * @return       返回结果
     * @throws Throwable 运行异常
     */
    Object invoke(Object proxy, Method method,Object[] args) throws Throwable;
}

public interface Foo {
    int foo();
    void bar();
}
public class Obj {
    static class Target implements Foo {
        @Override
        public int foo() {
            System.out.println("foo");
            return 100;
        }

        @Override
        public void bar() {
            System.out.println("bar");
        }
    }

    public static void main(String[] args) {
        $Proxy0 proxy0 = new $Proxy0(new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Exception {
                System.out.println("before...");
                return method.invoke(new Target(),args);
            }
        });
        proxy0.bar();
        int foo = proxy0.foo();
        System.out.println(foo);
    }
}
public class $Proxy0 implements Foo {
    private InvocationHandler h;

    static Method foo;
    static Method bar;

    static {
        try {
            bar = Foo.class.getDeclaredMethod("bar");
            foo = Foo.class.getDeclaredMethod("foo");
        } catch (NoSuchMethodException e) {
            e.printStackTrace();
        }
    }

    public $Proxy0(InvocationHandler h) {
        this.h = h;
    }

    @Override
    public int foo() {
        try {
            return (int) h.invoke(this, foo, new Object[0]) + 1;
        } catch (RuntimeException | Error e) {
            throw e;
        } catch (Throwable e) {
            //对于检查异常需要包装成RuntimeException
            throw new UndeclaredThrowableException(e);
        }
    }

    @Override
    public void bar() {
        try {
            h.invoke(this, bar, new Object[0]);
        } catch (RuntimeException | Error e) {
            throw e;
        } catch (Throwable e) {
            //对于检查异常需要包装成RuntimeException
            throw new UndeclaredThrowableException(e);
        }
    }
}
JDK动态代理源码

在这里插入图片描述

在这里插入图片描述

JDK动态代理的优化
 public Object invoke(Object obj, Object... args)
        throws IllegalAccessException, IllegalArgumentException,
           InvocationTargetException
    {
        if (!override) {
            Class<?> caller = Reflection.getCallerClass();
            checkAccess(caller, clazz,
                        Modifier.isStatic(modifiers) ? null : obj.getClass(),
                        modifiers);
        }
        MethodAccessor ma = methodAccessor;             // read volatile
        if (ma == null) {
            ma = acquireMethodAccessor();
        }
        return ma.invoke(obj, args);
    }
  • 可以看到JDK反射的底层是使用了MethodAccessor的实现类
  • 实际上由于反射的效率低下,在循环反射16次后,直到第17次会使用GeneratedMethodAccessor创建一个代理对象出来直接调用方法,不再使用反射调用

在这里插入图片描述

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

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

相关文章

MYSQL 8.0 配置CDC(binlog)

CDC&#xff08;Change Data Capture&#xff09;即数据变更抓取&#xff0c;通过源端数据源开启CDC&#xff0c;ROMA Connect 可实现数据源的实时数据同步以及物理表的物理删除同步。这里介绍通过开启Binlog模式CDC功能。 注意&#xff1a;1、使用MYSQL8.0及以上版本。 2、不…

快讯|2024 财年第一季度 Tubi 收益增长了 30%

2024 财年第一季度 Tubi 收益增长了 30%&#xff0c;月活跃用户达到了 7000 万 近日&#xff0c;在 2024 财年第一季度财务收益电话会议上&#xff0c;Fox 执行主席兼 CEO Lachlan Murdoch 对 Tubi 的增长表示赞赏&#xff1a;“Tubi 又多了一个令人羡慕的季度&#xff0c;收入…

电脑技巧:台式机噪音非常大的几个原因以及解决办法

目录 一、CPU风扇灰尘太厚、风扇轴承老化 二、电源风扇有灰尘或者老化 三、显卡风扇有灰尘或者老化 四、硬盘老化导致的电脑主机声音大 五、台式机CPU风扇声音过大 今天小编给大家分享台式机噪音非常大的几个原因以及解决办法&#xff0c;值得收藏&#xff01; 一、CPU风…

Typecho V1.2.1 博客更换域名还原

网站老是到期或则要换服务器&#xff08;IP地址&#xff09;&#xff0c;单独改IP老是有图片不能加载&#xff0c;出个完整的迁移教程&#xff1a; 系统环境&#xff1a;Ubuntu 2204 宝塔面板 8.0.3 Nginx1.22 PHP 8.1 MySQL 5.7 备份 进入宝塔将网站根目录直接压缩&#xff0…

如何调试 Dubbo 协议调用过程

微服务架构下的快速交付、灵活部署等优势使得 Dubbo 协议已成为了当今互联网基础建设里的一大热点。 Dubbo 协议是一款由阿里巴巴开发并开源的一款高性能 Java RPC 框架&#xff0c;凭借着高效的远程调用、服务注册与发现、灵活的配置等特点&#xff0c;在微服务后端开发场景中…

Excel自学三部曲_Part3:Excel工作场景实战(四)

文章目录 四、高级函数与数据连接1. 多窗口操作2. VLOOKUP函数3. XLOOKUP函数4. CSV数据格式 四、高级函数与数据连接 1. 多窗口操作 如何将两张子表数据&#xff08;战区信息、城市信息&#xff09;连接到主表数据&#xff08;成交数据&#xff09;&#xff0c;增加主要数据的…

AI识别网关助力打造防溺水监测预警系统

防溺水监测预警系统的应用场景广泛&#xff0c;常见的诸如海边、河道、湖泊、泳池等多种场景&#xff0c;均可借助防溺水监测预警系统加强保障民众人身安全。随着科技水平不断提升&#xff0c;防溺水监测预警系统不断融合人工智能、视觉识别、物联网等先进技术&#xff0c;能够…

三季度业绩狂飙后,贝泰妮将开启集团化运营的“中场战事”?

双十一前夕&#xff0c;贝泰妮交出了一份亮眼的答卷。 得益于销售端和研发端的发展动能强劲&#xff0c;第三季度贝泰妮营收10.64亿元&#xff0c;同比增长25.77%&#xff1b;扣非净利润1.34亿元&#xff0c;同比增长39.88%。 如此亮眼的业绩&#xff0c;自然引得资本市场侧目…

【Python】多进程线程与CPU核数

多进程数量设置为CPU核数&#xff0c;或者略小于CPU核数&#xff1b;多线程数量&#xff0c;如果是CPU密集任务设为1&#xff1b;如果是IO密集设为合理的值&#xff1b;IO密集型&#xff1a;系统运作&#xff0c;大部分的状况是CPU 在等I/O &#xff08;硬盘/内存&#xff09;的…

单链表的建立(头插法、尾插法)(数据结构与算法)

如果要把很多个数据元素存到一个单链表中&#xff0c;如何操作&#xff1f; 1.初始化一个单链表 2. 每次取一个数据元素&#xff0c;插入到表尾/表头 1. 尾插法建立单链表 尾插法建立的单链表元素顺序与输入数据集合的顺序相同&#xff0c;即按照输入数据的顺序排列。 使用尾插…

【蓝桥杯选拔赛真题09】C++输出回文数 青少年组蓝桥杯C++选拔赛真题 STEMA比赛真题解析

目录 C/C++输出回文数 一、题目要求 1、编程实现 2、输入输出 二、算法分析

MySQL中表的增删改查

目录 一、CRUD 二、新增&#xff08;Create&#xff09; &#xff08;1&#xff09;语法 &#xff08;2&#xff09;单行数据全列插入 &#xff08;3&#xff09;多行数据指定列插入 三、查询&#xff08;Retrieve&#xff09; &#xff08;1&#xff09;语法 …

vue3 + vite 安装配置及项目创建

node 和 npm 安装就不讲了&#xff0c;需要注意的是 node 需要版本是 16 以上。 VUE官网&#xff1a; https://cn.vuejs.org/ 一. 安装vue vite 1. 安装vue 方法一&#xff1a;<script> 标签 CDN 引入方式 <script src"https://unpkg.com/vue3/dist/vue.glo…

小米11 安装面具magisk 实现root

为了在安卓上抓包chatgpt 只能root小米11 来安装抓包工具小黄鸟 才能安装根证书来解析https。 1.官方解锁 2.下载小米11 安卓12 的开发版本 venus_images_V13.0.6.1.15.DEV_20220308.0000.00_12.0_cn_cb6b0c891f.tgz 进入刷机fastboot 3.进系统开启usb调试模式&#xff0c;…

GraphPad Prism v10.0.0.3(医学统计分析绘图软件)

GraphPad Prism 是一款医学统计和绘图软件&#xff0c;主要用于生物医学研究、实验设计和数据分析。以下是 GraphPad Prism 的主要功能和特点&#xff1a; 数据导入和整理&#xff1a;GraphPad Prism 可以导入各种数据格式&#xff0c;并提供直观的界面用于整理、编辑和管理数据…

PY32F071单片机,主频最高72 M,带一路DAC,USB

PY32F071 系列微控制器采用高性能的 32 位 ARM Cortex-M0内核&#xff0c;宽电压工作范围的 MCU。嵌入高达128 Kbytes flash 和 16 Kbytes SRAM 存储器&#xff0c;最高工作频率 72 MHz。包含多种不同封装类型多款产品。芯片集成多路 I2C、SPI、USART 等通讯外设&#xff0c;1 …

linux中各种最新网卡2.5G网卡驱动,不同型号的网卡需要不同的驱动,整合各种网卡驱动,包括有线网卡、无线网卡、Wi-Fi热点

linux中各种最新网卡2.5G网卡驱动&#xff0c;不同型号的网卡需要不同的驱动&#xff0c;整合各种网卡驱动&#xff0c;包括有线网卡、无线网卡、自动安装Wi-Fi热点。 最近在做路由器二次开发&#xff0c;现在市面上卖的新设备&#xff0c;大多数都采用了2.5G网卡&#xff0c;…

flutter项目引入本地静态图片资源并展示

想要在flutter中引入静态资源&#xff0c;需要配置pubspec.yaml&#xff0c;将本地的静态资源添加到assets下面&#xff1a; 然后在flutter引入这些静态资源&#xff1a; Image.asset("images/squick.png") 就可以在app中看到这个图片了&#xff1a; 也可以使用网…

vue使用Web Speech API实现语音播报

SpeechSynthesisUtterance对象用于表示要播放的语音内容&#xff0c;SpeechSynthesis对象则用于控制语音的播放、暂停、停止等操作。 const synth window.speechSynthesis const msg new SpeechSynthesisUtterance() // 语音播放 const playVoice (text) > {synth.canc…

双热点机制结合。5+铜死亡+铁死亡相关基因生信思路

今天给同学们分享一篇结合铜死亡和铁死亡相关基因预测肿瘤预后、免疫和药敏的生信文章“A novel signature of combing cuproptosis- with ferroptosis-related genes for prediction of prognosis, immunologic therapy responses and drug sensitivity in hepatocellular car…