高级Spring之jdk 和 cglib 在 Spring 中的统一

news2024/11/23 10:02:06

Spring 中对切点、通知、切面的抽象如下

  • 切点:接口 Pointcut,典型实现 AspectJExpressionPointcut

  • 通知:典型接口为 MethodInterceptor 代表环绕通知

  • 切面:Advisor,包含一个 Advice 通知,PointcutAdvisor 包含一个 Advice 通知和一个 Pointcut

 

代理相关类图

  • AopProxyFactory 根据 proxyTargetClass 等设置选择 AopProxy 实现

  • AopProxy 通过 getProxy 创建代理对象

  • 图中 Proxy 都实现了 Advised 接口,能够获得关联的切面集合与目标(其实是从 ProxyFactory 取得)

  • 调用代理方法时,会借助 ProxyFactory 将通知统一转为环绕通知:MethodInterceptor

 

演示 - 底层切点、通知、切面

 public static void main(String[] args) {
        /*
            两个切面概念
            aspect =
                通知1(advice) +  切点1(pointcut)
                通知2(advice) +  切点2(pointcut)
                通知3(advice) +  切点3(pointcut)
                ...
            advisor = 更细粒度的切面,包含一个通知和切点
         */

        // 1. 备好切点
        AspectJExpressionPointcut pointcut = new AspectJExpressionPointcut();
        pointcut.setExpression("execution(* foo())");
        // 2. 备好通知
        MethodInterceptor advice = invocation -> {
            System.out.println("before...");
            Object result = invocation.proceed(); // 调用目标
            System.out.println("after...");
            return result;
        };
        // 3. 备好切面
        DefaultPointcutAdvisor advisor = new DefaultPointcutAdvisor(pointcut, advice);

        /*
           4. 创建代理
                a. proxyTargetClass = false, 目标实现了接口, 用 jdk 实现
                b. proxyTargetClass = false,  目标没有实现接口, 用 cglib 实现
                c. proxyTargetClass = true, 总是使用 cglib 实现
         */
        Target2 target = new Target2();
        ProxyFactory factory = new ProxyFactory();
        factory.setTarget(target);
        factory.addAdvisor(advisor);
        factory.setInterfaces(target.getClass().getInterfaces());
        factory.setProxyTargetClass(false);
        Target2 proxy = (Target2) factory.getProxy();
        System.out.println(proxy.getClass());
        proxy.foo();
        proxy.bar();
    }

    interface I1 {
        void foo();

        void bar();
    }

    static class Target1 implements I1 {
        public void foo() {
            System.out.println("target1 foo");
        }

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

    static class Target2 {
        public void foo() {
            System.out.println("target2 foo");
        }

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

  学到了什么
                a. Spring 的代理选择规则
                b. 底层的切点实现
                c. 底层的通知实现
                d. ProxyFactory 是用来创建代理的核心实现, 用 AopProxyFactory 选择具体代理实现
                    - JdkDynamicAopProxy
                    - ObjenesisCglibAopProxy

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

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

相关文章

关于构建校园能源管理平台的研究进展

摘要:能源与发展的矛盾已成为当今世界关注的焦点,高等学校做为一个特定的环境,近年来办学规模、校园面积、师生数量急剧增长,对能源的消耗也大幅提高。为抑制能源不合理增长,实现低碳发展,本文通过对校园能…

Go protobuf 的简单应用

环境搭建 安装 protobuf 编译器 https://github.com/protocolbuffers/protobuf/releases 解压,将bin目录加入环境变量 安装 protocol-gen-go 生成器 用于生成Go代码 https://github.com/protocolbuffers/protobuf-go/releases 解压,将可执行文件加…

第27章 分布式缓存数据库的定义实现

1 Core.HashHelper using System.Security.Cryptography; namespace Core { /// <summary> /// 【哈希助手--类】 /// <remarks> /// 摘要&#xff1a; /// 该类通过1个指定哈希加密算法生成1个唯一性的字符串(当前安全性较强的SHA-2包括有&#xff1a;SHA-2…

九龙证券|三胎概念股拉升…港股跳水,恒生科指重挫近5%

兔年首个交易日&#xff0c;A股迎来开门红&#xff0c;沪指开盘即打破3300点&#xff0c;创业板指一度涨近3%&#xff1b;港股却大幅下挫&#xff0c;恒生科技指数一度跌超5%。 详细来看&#xff0c;A股方面&#xff0c;两市股指全线高开&#xff0c;沪指开盘即打破3300点&…

WebDAV之葫芦儿·派盘+Keepass2Android

Keepass2Android 支持WebDAV方式连接葫芦儿派盘。 推荐一款密码管理器,允许人们使用复杂的组合进行登录,而不必记住所有的组合。 Keepass2Android可以支持大多数安卓互联网浏览器, Android设备上同步软件,还支持通过WebDAV添加葫芦儿派盘。

Versal系列0-AI Engine与Systolic Array

最近在开发VCK190时&#xff0c;发现Xilinx Versal系列的AI engine&#xff08;AIE&#xff09;&#xff0c;其实和Systolic Array&#xff08;SA&#xff09;有着很相似的地方。Xilinx工程师在研发AIE时&#xff0c;应该是有所借鉴SA的。Systolic Array最早是H. T. Kung于1982…

k8s工具kubepi介绍

目录 部署安装 登录 配置 日常操作 Kubepi是一个简单高效的k8s集群图形化管理工具&#xff0c;方便日常管理K8S集群&#xff0c;高效快速的查询日志定位问题的工具。 部署安装 持久化部署 # 创建持久化目录 mkdir -p /opt/kubepi # 安装 sudo docker run --privileged …

通信原理笔记—绪论

目录 通信的基本概念&#xff1a; 通信的目的&#xff1a;要克服某种障碍&#xff0c;实现信息高效、准确地传递。 狭义的通信系统&#xff1a; 广义的通信系统&#xff1a; 数字通信系统的基本组成&#xff1a; 数字通信的特点&#xff1a; (1)抗噪声和干扰能力强&#…

【自学Docker】Docker commit命令

Docker commit命令 大纲 docker commit命令教程 docker commit 命令用于根据 Docker容器 的更改创建一个新的 Dokcer镜像。该命令后面的 CONTAINER 可以是容器Id&#xff0c;或者是容器名。 docker commit命令语法 haicoder(www.haicoder.net)# docker commit [OPTIONS] CO…

day02_java入门

今日内容 零、 复习昨日 一、程序介绍 二、Java发展及特点 三、安装环境 四、运行机制 五、第一个程序 六、Java语言规范 七、了解DOS命令 八、作业 一、程序介绍 生活中程序: 为了到达某个目的,规定一些步骤. 计算机程序:为了完成某个功能,规定一些步骤. 模拟现实世界&#…

React的基本使用(及脚手架使用)

基本使用 1 React 的安装 安装命令&#xff1a;npm i react react-dom react 包是核心&#xff0c;提供创建元素、组件等功能react-dom 包提供 DOM 相关功能等 1. 引入 react 和 react-dom 两个 js 文件 <script src"./node_modules/react/umd/react.development.…

图、邻接矩阵、广度与深度优先、生成树

最近突然被问到这个问题&#xff0c;于是复习一下&#xff0c;用最通俗的语言解释。 图 无向图&#xff1a;如下左图各个顶点之间用不带箭头的边连接的图&#xff1b;相应的右图就是有向图 邻接矩阵 可以理解为表示上述图中顶点与顶点之间是否有直接相连的边&#xff08;有则…

定时任务组件Quartz

1 定时任务组件Quartz 1.1 Quartz介绍 Quartz是Job scheduling&#xff08;作业调度&#xff09;领域的一个开源项目&#xff0c;Quartz既可以单独使用也可以跟spring框架整合使用&#xff0c;在实际开发中一般会使用后者。使用Quartz可以开发一个或者多个定时任务&#xff0c;…

计算机网络第四章 网络层数据平面

4.0 目录[TOC]4.1 概述作用&#xff1a;主机到主机之间传输TCP segment或UDP datagram将段封装成IP datagram以及解封装IP datagram【在网络边缘和路由器上都要进行】A.两大功能&#xff1a;转发路由转发&#xff1a;从不同的端口接收数据&#xff0c;再通过合适的端口发送出去…

WPS表格:函数公式

文章目录1. ROW()、ROWS(array)1&#xff09;ROW()2&#xff09;ROWS(array)2. COUNT(参数)、COUNTA(参数)、COUNTIF(参数)1&#xff09;COUNT()2&#xff09;COUNTA()3&#xff09;COUNTIF()3. VLOOKUP(参数)、LOOKUP(参数)1&#xff09;VLOOKUP(参数)2&#xff09;LOOKUP(向量…

数据分析有发展前景吗?,零基础能学得会吗?

数据分析这门专业是近几年因大数据的出现而产生的新兴职业&#xff0c;分为大数据分析和数据分析师&#xff0c;区别在于大数据分析师要求更高&#xff0c;不仅需要数据分析的基本能力&#xff0c;还要具备编程能力、机器学习技能&#xff0c;以及本身所接触到处理的都是海量数…

webpack打包构建工具的使用和相关的配置

目录 一、 webpack的基础使用步骤 二、webpack的配置 1、入口和出口 2、 webpack打包后自动生成html文件并自动引入打包后的js 3、加载器loader 3.1、处理css文件 3.2、处理less文件 3.3、处理图片文件 3.4、处理字体文字 3.5、处理高版本js语法&#xff08;降级&#xff…

Linux locate命令

Linux locate命令用于查找符合条件的文档&#xff0c;他会去保存文档和目录名称的数据库内&#xff0c;查找合乎范本样式条件的文档或目录。一般情况我们只需要输入 locate your_file_name 即可查找指定文件。语法locate [-d ][--help][--version][范本样式...]参数&#xff1a…

Notepad++ 代码格式化插件工具

因为notepad的NppAStyle插件只支持格式化C、C、C#、Java这四种编程语言的代码&#xff0c;所以推荐使用这个CoolFormat的插件&#xff0c;相比于NPPAStyle&#xff0c;CoolFormat支持C\C\C#\CSS\HTML\Java\JavaScript\JSON\Objective-C\PHP\SQL\XML代码格式化工具。还可以作为V…

后端java模拟前端RSA.js加密登录爬虫

项目开发过程中&#xff0c;经常会遇到数据爬取需求&#xff0c;但是对于某些网站&#xff0c;由于前端加密&#xff0c;导致数据爬取不容易。比如某网站&#xff0c;前端使用RSA.js加密&#xff0c;并且后端返回对应的公钥的指数和模数&#xff0c;通过后端返回的指数和模数对…