spring两种代理方式

Spring 提供了两种主要的代理(proxy)方式,分别是基于JDK动态代理和基于CGLIB的代理。这两种代理方式各有其特点和适用场景。

 1. JDK动态代理

特点:
- 基于Java的接口(Interface)。
- 代理类必须实现一个或多个接口。
- 使用java.lang.reflect.Proxy类和java.lang.reflect.InvocationHandler接口来实现。

优点:
- 实现简单,性能较好。
- 生成的代理类是接口的实现类,遵循面向接口编程的原则。

缺点:
- 只能代理接口,无法代理具体类。

适用场景:
- 被代理对象有一个或多个接口时。

代码示例:

java
public interface Service {
    void perform();
}

public class ServiceImpl implements Service {
    @Override
    public void perform() {
        System.out.println("Performing service...");
    }
}

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

public class ServiceInvocationHandler implements InvocationHandler {
    private final Object target;

    public ServiceInvocationHandler(Object target) {
        this.target = target;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        System.out.println("Before method invocation");
        Object result = method.invoke(target, args);
        System.out.println("After method invocation");
        return result;
    }

    public static void main(String[] args) {
        ServiceImpl service = new ServiceImpl();
        Service proxy = (Service) Proxy.newProxyInstance(
                service.getClass().getClassLoader(),
                new Class[]{Service.class},
                new ServiceInvocationHandler(service)
        );
        proxy.perform();
    }
}


 2. CGLIB代理

特点:
- 基于字节码生成,使用底层字节码增强技术。
- 可以代理没有实现接口的具体类。
- 使用net.sf.cglib.proxy.Enhancer类和net.sf.cglib.proxy.MethodInterceptor接口来实现。

优点:
- 可以代理具体类,不需要依赖接口。
- 能够代理方法调用,提高灵活性。

缺点:
- 性能比JDK动态代理稍差。
- 生成的代理类是目标类的子类,可能会有一些不兼容的情况(例如目标类是final类,或者目标方法是final方法时无法代理)。

适用场景:
- 被代理对象没有接口,或者需要代理类中的具体方法时。

代码示例:

java
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;

import java.lang.reflect.Method;

public class Service {
    public void perform() {
        System.out.println("Performing service...");
    }
}

public class ServiceMethodInterceptor implements MethodInterceptor {
    @Override
    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {
        System.out.println("Before method invocation");
        Object result = proxy.invokeSuper(obj, args);
        System.out.println("After method invocation");
        return result;
    }

    public static void main(String[] args) {
        Enhancer enhancer = new Enhancer();
        enhancer.setSuperclass(Service.class);
        enhancer.setCallback(new ServiceMethodInterceptor());
        Service proxy = (Service) enhancer.create();
        proxy.perform();
    }
}


 总结

- 使用JDK动态代理时,必须有接口,适用于面向接口编程的场景。
- 使用CGLIB代理时,不需要接口,适用于需要代理具体类的方法的场景。
- Spring AOP默认使用JDK动态代理,如果没有接口才使用CGLIB代理。可以通过配置明确指定代理方式。

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

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

相关文章

contos7使用docker安装vulhub

contos7下使用docker安装vulhub 1. 安装docker 1. 更新yum (1)切换root用户 su root (2)更新yum yum update 2. 卸载旧版本的docker sudo yum remove docker sudo yum remove docker-client sudo yum remove docker-clien…

【个人博客搭建】(21)使用AutoMap对象映射

在.NET WebAPI项目中,使用AutoMap进行对象映射是一种高效的数据处理方式。通过自动映射机制,可以极大地简化对象之间的转换过程,提高代码的可维护性和整洁性。下面将详细探讨如何在.NET WebAPI中使用AutoMap进行对象映射: 安装和配…

高并发ping多台主机IP

简介 社区或者是大型公司往往有成千上万或者几百台设备,保持设备始终在线对网络运维人员来说至关重要,然而一个一个登录检查,或者一个一个ping并不明智,累人且效率极低,并出错率高。花钱买检测服务当我没说。 shell编…

K210视觉识别模块学习笔记5:(嘉楠)训练使用模型_识别人脸

今日开始学习K210视觉识别模块:(嘉楠)训练与使用模型_识别人脸 亚博智能的K210视觉识别模块...... 固件库版本: canmv_yahboom_v2.1.1.bin 之前的训练网址部署模型时需要我们自己更换固件,而且还不能用亚博的图像操作库函数了,这十分不友好&#xff0…

Web前端从什么学起:探索前端世界的起点与路径

Web前端从什么学起:探索前端世界的起点与路径 在数字化浪潮席卷而来的今天,Web前端技术作为构建用户界面的核心力量,日益受到人们的关注。对于初学者来说,Web前端的学习旅程可能充满了未知与挑战。那么,Web前端究竟应…

liunx查看日志

tail查看日志 tail 查看文件的末尾部分 -f 实时监控日志文件的更新,如果有新的日志将会实时显示 -n 查看日志的后n行 tail -fn 100 filename.log // 实时查看filename.log的最后100行head查看日志 head 查看日志的头部 -n 指定查看行数 head -n 100 filename.log…

vue 使用 Vxe UI vxe-print 实现复杂的 Web 打印,支持页眉、页尾、分页的自定义模板

Vxe UI vue 使用 Vxe UI vxe-print 实现复杂的 Web 打印,支持页眉、页尾、分页的自定义模板 官方文档 https://vxeui.com 查看 github、gitee 页眉-自定义标题 说明:vxe-print-page-break标签用于定义分页,一个标签一页内容,超…

c语言基础篇B

B1.数据的输入与输出 c语言本身不提供输入输出语句,输入和输出操作是由c函数库中的函数来实现的在使用系统库函数时,要用预编译命令“#include”将有关的“头文件”包括到用户源文件中 include"stdio.h"或者include B2.printf()函数&#x…

Python怎么分开画图:深入探索与实战应用

Python怎么分开画图:深入探索与实战应用 在Python的数据可视化领域,分开画图是一项至关重要的技能。它能够帮助我们更清晰、更有条理地展示数据,进而发现数据中的规律和趋势。本文将从四个方面、五个方面、六个方面和七个方面,详…

YOLOv5改进 | 主干网络 | 用SimRepCSP作为主干网络提取特征【全网独家 + 降本增效】

💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 SimRepCSP 类似于 YOLOv7的主干网络,由卷积模块和重参数化卷积(RepConv)模块组合而成,以 Cro…

WPF Command 的使用

一、Command类的创建 >> 构造函数方法中传入了一个委托 public class MyCommand : ICommand { public readonly Action _action; public MyCommand(Action action) { this._action action; } public event EventHandler CanExecuteChanged;…

学习使用 Frida 过程中出现的问题

一、adb shell命令报错:error: no devices found 目前该问题解决方法仅供参考,可先看看再选择试试!!!!! 查看此电脑也会发现没有出现手机型号文件夹。 第一步: 检查一下手机开了u…

谷神后端代码模板:导入

SELECT NULL AS MID,NULL AS FILE_NAME,NULL AS FILE_PATH FROM DUAL;

【打印100个常用Linux命令】

#!/bin/bash 定义一个函数,用于打印100个常用Linux命令 print_commands() { echo “以下是一些常用的Linux命令:” echo “----------------------------------” echo “1. pwd - 显示当前工作目录” echo “2. ls - 列出当前目录下的文件和文件夹” …

qmt量化交易策略小白学习笔记第16期【qmt编程之获取北向南向资金(沪港通,深港通和港股通)】

qmt编程之获取北向南向资金 qmt更加详细的教程方法,会持续慢慢梳理。 也可找寻博主的历史文章,搜索关键词查看解决方案 ! 北向南向资金(沪港通,深港通和港股通) #北向南向资金交易日历 获取交易日列表…

【CentOS 7】CentOS 7极致指南:高级部署PyCharm 2022.3.3专业版,实现定制化配置与无缝桌面集成

【CentOS 7】CentOS 7极致指南:高级部署PyCharm 2022.3.3专业版,实现定制化配置与无缝桌面集成 大家好 我是寸铁👊 总结了一篇CentOS 7极致指南:高级部署PyCharm 2022.3.3专业版,实现定制化配置与无缝桌面集成✨ 喜欢的…

线性代数|机器学习-P10最小二乘法的四种方案

文章目录 1. 概述2. SVD奇异值分解3. 最小二乘法方程解4. 最小二乘法图像解释5. Gram-Schmidt 1. 概述 当我们需要根据一堆数据点去拟合出一条近似的直线的时候,就会用到 最小二乘法 .根据矩阵A的情况,有如下四种方法 在r n m 时,SVD奇异…

Day16—API爬取与数据整合

在网络爬虫的领域,API(应用程序编程接口)提供了一种更为直接和高效的方式来获取数据。与直接从网页内容中提取数据相比,API通常提供更结构化、更易于解析的数据格式。 1. API爬取的优势 速度:API请求通常比网页加载更快,因为它们返回的是数据本身,而不是包裹数据的HTML…

计算机网络-数制转换与子网划分

目录 一、了解数制 1、计算机的数制 2、二进制 3、八进制 4、十进制 5、十六进制 二、数制转换 1、二进制转十进制 2、八进制转十进制 3、十六进制转十进制 4、十进制转二进制 5、十进制转八进制 6、十进制转十六进制 三、子网划分 1、IP地址定义 2、IP的两种协…

Web前端初级考证:探索与征服数字世界的初始之旅

Web前端初级考证:探索与征服数字世界的初始之旅 在数字浪潮席卷而来的今天,Web前端技术成为了连接现实与虚拟的桥梁。对于初学者而言,通过Web前端初级考证,不仅是对自身技能的检验,更是迈向更高层次的关键一步。本文将…