CGLib动态代理技术

news2024/11/16 23:42:00

基于CGLib的动态代理机制,ProxyFactoryy无需再像JDK动态代理那样实现一个interface,实际情况下可能这个interface并不存在,只需要实现另外一个接口MethodInterceptor即可
在这里插入图片描述
在这里插入图片描述

package com.hmdp.service.尚硅谷的代理模式3;
//CGlib代理

import org.springframework.cglib.proxy.Enhancer;
import org.springframework.cglib.proxy.MethodInterceptor;
import org.springframework.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;
class TeacherDao  {
    public void teach()
    {
        System.out.println("老师授课中...我是CGLib,不需要实现接口");
    }
}
class ProxyFactory implements MethodInterceptor {
//    维护一个目标对象,被代理对象
    private Object target;
//    构造器,传入一个被代理对象
    public ProxyFactory(Object target)
    {
        this.target = target;
    }
//    返回一个代理对象,是target对象的代理对象
    public Object getProxyInstance(){

//        1. 创建一个工具类
        Enhancer enhancer = new Enhancer();
//        2. 设置父类
        enhancer.setSuperclass(target.getClass());
//        3. 设置回调函数
        enhancer.setCallback(this);
//        4. 创建子类对象,即代理对象
        return enhancer.create();
    }
    @Override public Object intercept(Object o, Method method, Object[] args, MethodProxy methodProxy) throws Throwable
    {
        System.out.println("CGLib代理模式~~开始");
        Object returnVal = methodProxy.invokeSuper(o, args);
        System.out.println("CGLib代理模式~~结束");
        return returnVal;
    }
}
public class Main {
    public static void main(String[] args) {
//        创建目标对象
        TeacherDao target = new TeacherDao();
//        获取到代理对象,并且将目标对象传给代理对象
        TeacherDao proxyInstance =(TeacherDao) new ProxyFactory(target).getProxyInstance();
//        执行代理对象的方法,触发intercept方法,从而实现对目标对象的调用
        proxyInstance.teach();
    }
}

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

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

相关文章

UE5 03-物体碰撞检测

在你需要碰撞的物体上添加一个碰撞检测组件 碰撞预设 设置为NoCollision,这样移动过程中就不会有物理碰撞阻挡效果,只负责检测是否碰撞,比较难解释,如果学过Unity的话,可以把它理解成 Collision 为 Trigger

INFINI Console 使用介绍

上次在《INFINI Easysearch尝鲜Hands on》中我们部署了两个节点的Easysearch,并且也设置了Console对集群进行监控。那么今天我们再来介绍下INFINI Console的使用。 INFINI Console 仪表盘功能介绍 INFINI Console 是一个功能强大的数据管理和分析平台,…

conda env pip install error:No space left on device

conda 环境 pip install error:No space left on device 文章目录 conda 环境 pip install error:No space left on device现象1 实验2 分析和解决办法 现象 非root用户的服务器,需要安装环境,安装的环境超过2GB sudo pip insta…

Roboflow自动标定数据集

最近需要自己打数据集,记录一下用Roboflow来打标签。 https://roboflow.com/(官网) 进入官网先注册,注册完成后进入这个界面。 我先讲如果不想让数据集公开怎么办,因为这里每个新建的都是公开的。新账号进去应该进去…

Python | Leetcode Python题解之第214题最短回文串

题目: 题解: class Solution:def shortestPalindrome(self, s: str) -> str:n len(s)fail [-1] * nfor i in range(1, n):j fail[i - 1]while j ! -1 and s[j 1] ! s[i]:j fail[j]if s[j 1] s[i]:fail[i] j 1best -1for i in range(n - 1,…

LIS2DH12

LIS2DH12 是属于“nano”系列的超低功耗高性能 3 轴线性加速度计,具有数字 I 2C、SPI 串行接口标准输出。 器件具有超低功耗工作模式,可实现高级节能、智能睡眠唤醒以及恢复睡眠功能。 LIS2DH12 具有2g/4g/8g/16g 的动态用户可选满量程,并能通…

Adobe Acrobat添加时间戳服务器

文章目录 前言一、Adobe Acrobat添加时间戳服务器1.打开Adobe Acrobat软件2.点击【菜单】→ 【首选项】3.点击【安全性】→【更多】4.点击【新建】5.输入【名称】→【服务器URL】 前言 一、Adobe Acrobat添加时间戳服务器 1.打开Adobe Acrobat软件 2.点击【菜单】→ 【首选项…

汽车电子零部件(15):车载TFT LCD显示模组

前言: 车载显示越来越受到重视,屏的使用越来越大且多,车载显示屏模组技术也在快速发展。 在复杂的显示技术世界中,薄膜晶体管(TFT,Thin Film Transistor)液晶显示器(LCD,Liquid Crystal Display)模块的制造证明了现代工程的奇迹。 TFT显示器是全彩色LCD,提供明亮、生…

WPF 3D绘图 点云 系列五

基本概念:点云是某个坐标系下的点的数据集。 可能包含丰富的信息,包括三维坐标X,Y,Z、颜色、分类值、强度值、时间等等 点云可以将现实世界原子化,通过高精度的点云数据可以还原现实世界。万物皆点云。 通过三维激光扫描仪进行数据采集获取点云数据,其次通过二维影像进行…

新手教学系列——使用uWSGI对Flask应用提速

在构建和部署Flask应用时,性能和稳定性是两个关键的因素。为了提升Flask应用的性能,我们可以借助uWSGI这个强大的工具。本文将详细介绍为什么要使用uWSGI、uWSGI的底层原理,并提供一个实例配置,帮助你更好地理解和应用这个工具。 为什么要使用uWSGI uWSGI 是一个应用服务…

docker部署简单的Kafka

文章目录 1. 拉取镜像2. 运行创建网络运行 ZooKeeper 容器运行 Kafka 容器 3. 简单的校验1. 检查容器状态2. 检查 ZooKeeper 日志3. 检查 Kafka 日志4. 使用 Kafka 命令行工具检查5. 创建和删除测试主题 1. 拉取镜像 选择一组兼容性好的版本。 docker pull bitnami/kafka:3.6…

【C++】类和对象(中)--上篇

个人主页~ 类和对象上 类和对象 一、类的六个默认成员函数二、构造函数1、构造函数基本概念2、构造函数的特性 三、析构函数1、析构函数的概念2、特性 四、拷贝构造函数1、拷贝构造函数的概念2、特征 一、类的六个默认成员函数 如果有个类中什么成员都没有,那么被称…

[C++初阶]vector的初步理解

一、标准库中的vector类 1.vector的介绍 1. vector是表示可变大小数组的序列容器 , 和数组一样,vector可采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效。但是又不像数组,它的大…

营销故事之扩大牙膏开口

职场营销故事“扩大牙膏开口”又可以说是“牙膏开口扩大1毫米”,为十大经典营销故事之一。某品牌的牙膏,包装精美,品质优良,备受顾客喜爱,连续10年营业额保持10%-20%的增幅。可到了第11年,销售业绩却停滞不…

API-正则表达式

学习目标: 掌握正则表达式 学习内容: 什么是正则表达式语法元字符修饰符 什么是正则表达式: 正则表达式是用于匹配字符串中字符组合的模式。在JavaScript中,正则表达式也是对象。 通常用来查找、替换那些符合正则表达式的文本&a…

泛微开发修炼之旅--26前端j实现手机号码验证

文章链接:26前端j实现手机号码验证

开关电源中强制连续FCCM模式与轻载高效PSM,PFM模式优缺点对比笔记

文章目录 前言一、连续FCCM模式优点:缺点: 二,轻载高效PSM,PFM优点:缺点: 总结 前言 今天我们来学习下开关电源中,强制连续FCCM模式与轻载高效PSM,PFM模式优缺点对比 一、连续FCCM模式 优点: …

安装 VisualSVN Server提示HTTP服务无法启动的问题解决

安装 VisualSVN Server 版本:VisualSVN-Server-5.4.0-x64 安装包在安装到一半的时候,弹窗提示:HTTP服务无法启动,网上找了一大堆,说是service里面更改用户为本地用户什么的都没用用,点右键也无法启动。 …

【Python实战因果推断】17_线性回归的不合理效果7

目录 Regression for Dummies Conditionally Random Experiments Dummy Variables Regression for Dummies 回归和正交化固然很好,但归根结底,你必须做出独立性假设。你必须假设,在考虑到某些协变量的情况下,干预看起来与随机分…

力扣67 二进制求和

文章目录 1. 题目链接2. 题目代码3.感受 1. 题目链接 二进制求和 2. 题目代码 class Solution { public:string addBinary(string a, string b) {vector<int> stringA;vector<int> stringB;int lengthOfA a.length();int lengthOfB b.length();for(int subscrip…