Spring的代理方式

Spring动态代理的两种方式 JDK动态代理Proxy.newProxyInstance()通过接创建代理的实现类Cglib动态代理Enhancer通过继承类创建的代理类若有错误,希望大佬指出。对你有帮助给点个??再走呗。先自我介绍一下,小编13年上师交大毕业,曾经在小公司待过,去过华为OPPO等大厂,18年进入阿里,直到现在。深知大多数初中级java工程师,想要升技能,往往是需要自己摸索成长或是报班学习,但对于培训机构动则近万元的学费,着实压力不小。自己不成体系的自学效率很低又漫长,而且容易碰到天花板技术停止不前。... 阅读详情

方式一、二公共代码

编写一个接口

package com.cloud.daili;
public interface UserService {
	void queryUser();
	void saveUser();
	void deleteUser();
}

接口实现类

package com.cloud.daili;
public class UserServiceImpl implements UserService{
	@Override
	public void queryUser() {
		System.out.println("UserServiceImpl.queryUser()");
	}
	@Override
	public void saveUser() {
		System.out.println("UserServiceImpl.saveUser()");
	}
	@Override
	public void deleteUser() {
		System.out.println("UserServiceImpl.deleteUser()");
	}
}

方式一:模拟代理方式

代码模拟

package com.cloud.daili;
public class UserServiceImplProxy implements UserService{
	private UserService userService;
	public UserServiceImplProxy(UserService userService){
		this.userService = userService;
	}
	@Override
	public void queryUser() {
		System.out.println("执行之前");
		userService.queryUser();
		System.out.println("执行之后");
	}
	@Override
	public void saveUser() {
		userService.saveUser();
	}
	@Override
	public void deleteUser() {
		userService.deleteUser();
	}
}

方式二:实现接口

InvocationHandler接口


package com.cloud.daili;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class LogJdkProxy implements InvocationHandler{
	private Object target;
	public LogJdkProxy(Object target){
		this.target = target;
	}
	/**
	 * 创建一个代理对象
	 * @return 代理对象
	 */
	public Object createProxyInstance(){
		return Proxy.newProxyInstance(getClass().getClassLoader(), target.getClass().getInterfaces(), this);
	}
	@Override
	public Object invoke(Object proxy, Method method, Object[] args)
		throws Throwable {
		System.out.println("操作前...");
		//执行原始对象的方法
		Object result = method.invoke(target, args);
		System.out.println("操作后...");
		return result;
	}
}

方式一、二测试方法

package com.cloud.daili;
import org.junit.Test;
public class MyTest {
	/**
	 * 测试第一种代理方法
	 */
	@Test
	public void test1(){
		UserService userService = new UserServiceImpl();
		userService = new UserServiceImplProxy(userService);
		userService.queryUser();
	}
	/**
	 * 测试第二种代理方法
	 */
	@Test
	public void test2(){
		UserService userService=new UserServiceImpl();
	    userService=(UserService) new LogJdkProxy(userService).createProxyInstance();
	    userService.queryUser();
	}
}

方式三:实现MethodInterceptor接口

UserService2.java

package com.cloud.daili;
public class UserService2 {
	protected void method1(){
       System.out.println("UserService.method1()");
    }
    void method2(){
       System.out.println("UserService.method2()");
    }
    public void querUsers() {
       System.out.println("UserServiceImpl.querUsers()");
    }
    public void saveUser() {
       System.out.println("UserServiceImpl.saveUser()");
    }
    public void deleteUser() {
       System.out.println("UserServiceImpl.deleteUser()");
    }
}

LogCglibJdkProxy.java

import java.lang.reflect.Method;
import net.sf.cglib.proxy.Enhancer;
import net.sf.cglib.proxy.MethodInterceptor;
import net.sf.cglib.proxy.MethodProxy;
public class LogCglibJdkProxy implements MethodInterceptor{
   //目标对象
   private Object target;
   public LogCglibJdkProxy(Object target){
      this.target=target;
   }
   /**
    * 创建代理对象
    * @return
    */
   public Object createProxyInstance(){
      Enhancer enhancer=new Enhancer();
      //设置父类类型
      enhancer.setSuperclass(target.getClass());
      enhancer.setCallback(this);
      return enhancer.create();
   }
   @Override
   public Object intercept(Object obj, Method method, Object[] args,
         MethodProxy proxy) throws Throwable {
      System.out.println("操作前");
      //执行原始对象方法
      Object result=method.invoke(target, args);
      System.out.println("操作后");
      return result;
   }
}

测试方法

import org.junit.Test;
public class MainTest {
   @Test
   public void test1() throws Exception {
      UserService us=new UserService();
      us=(UserService) new LogCglibJdkProxy(us).createProxyInstance();
      us.querUsers();
      System.out.println();
      us.deleteUser();
      System.out.println();
      us.querUsers();
      System.out.println();
      us.method1();
      System.out.println();
      us.method2();
      System.out.println();
   }
}
spring代理实现 该资源包含了三种不同方式实现的代理模式,喜欢的下载。 立即下载

相关推荐

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文,我们在笔记本部署了Llama 3 8B大模型,使用Ollama搭建了基于Web 可视化对话机器人。在使用过程中,大模型经常出现中文问题英文回答的问题。本博文就用Llama3-Chinese-Chat微调模型来解决这个问题……

老牛啊 9238

静态代理与动态代理的区别

静态代理 什么是代理? 举个栗子,生活中的外卖平台,店铺是制作外卖的,然后放到平台上售卖。这里的店铺就是真实角色,为了能够让店铺不用担心销售等问题,从而能够更加专注做外卖,所以店铺的外卖都会放到平台上面。这里平台就是代理。平台代店家出售,而店家只需要做外卖就好了。 例子2 再比如程序中,当程序做出了一个操作的时候,应该要写一个相应的日志,代理的作用就是负责如日志...

u012777599的博客 1240

OpenCV13-图像噪声:椒盐噪声和高斯噪声

考虑到椒盐噪声会在图像中的任何一个位置随机产生,因此对于椒盐噪声的生成,需要使用OpenCV中能够产生随机数的函数。OpenCV中也没有专门为图像添加高斯噪声的函数,对早在图像中添加椒盐噪声的过程,可以根据需求利用能够产生随机数的函数来完成在图像中添加高斯噪声的任务。椒盐噪声又称作脉冲噪声,他会随机改变图像中的像素值,其样子就像是在图像上随机地撒上一些盐粒和黑椒粒,因此被称为椒盐噪声。函数能够产生均匀分布或者高斯分布的随机数,可以利用该函数产生符合高斯分布的随机数,之后在图像中加入这些随机数即可。

SHLYYY 5122

Spring框架中的代理模式

代理模式

YiGeiGiaoGiao的博客 1521

当R语言遇见MaxENT:参数优化的艺术与自动化调参实践

本文探讨了R语言与MaxENT在生态位建模中的结合应用,重点介绍了参数优化与自动化调参的实践方法。通过caret与ENMeval工具链,研究人员可以高效处理多物种、多环境变量的大规模分析任务,提升模型性能与工作效率。文章还涵盖了从数据准备到结果可视化的全流程,为生态学家提供了实用的技术指导。

corn8的博客 455

一文带你看懂SAP-HANA的基本架构与原理

创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥创作不易,希望大家一键三连支持!!!♥♥♥。

丷江南南的博客 5076

java代理模式详解

1.静态代理 角色分析: 抽象角色:一般会使用接口或者抽象类来解决 真实角色:被代理的角色 代理角色:代理真实角色,代理真实角色后,我们一般会做一些附属操作 客户:访问代理对象的人! 代码步骤: 接口 //租房 public interface Rent { public void rent(); } 2.真实角色 //房东 public class Host implements Rent{ public void rent() { Syst...

小璠的博客 440

信创服务器(麒麟 V10 SP3)安装 NVIDIA GeForce RTX 5070 驱动

本文介绍了在麒麟V10 SP3系统上安装NVIDIA RTX 5070显卡驱动的详细步骤。首先需要关闭nouveau驱动,安装必要的编译环境和工具,确保内核版本与kernel-devel完全一致。最后运行NVIDIA驱动安装程序,关键选择包括启用DKMS支持、编译模块、禁用32位兼容和nouveau驱动。整个流程适用于海光CPU和Blackwell架构GPU的国产操作系统环境。

猿小白的博客 672

Spring——代理模式

通俗易懂地讲解代理模式中的静态代理和动态代理。

一心同学的博客 1311

c++ webrtc基础(1) :webrtc源码下载与编译、项目模块介绍、学习资料推荐

本篇博客介绍webrtc源码的下载与编译,以及推荐webrtc学习资料。 源码下载 电脑环境:win10/win11 64bit,合理的上网环境,没有合理的网络环境无法拉取、下载webrtc代码和工具,宽带速度要快,尽量50M. 主要步骤如下: (1) 安装git (2) 打开cmd控制台,下载google开发工具depot_tools: git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git (3) 新建一个目

琅嬛福地 3295

基于STM32L4XX、HAL库的MMA8452QR1姿态传感器驱动程序设计

/ HAL库需要左移1位。#define MMA8452Q_I2C_ADDRESS 0x1D // SA0=1时的地址。* @param range: 量程(MMA8452Q_RANGE_2G/4G/8G)* @param haccel: MMA8452Q句柄。* @param haccel: MMA8452Q句柄。* @param haccel: MMA8452Q句柄。* @param haccel: MMA8452Q句柄。* @param haccel: MMA8452Q句柄。

zhusl6688的博客 771

Spring的动态代理

当代理对象调用接口方法时,实际执行的是代理类中的对应方法。动态代理是Java语言中的一个重要特性,它允许我们在运行时动态地创建代理对象,而无需在编译时就确定代理对象的类型。在动态代理中,代理对象与目标对象实现了相同的接口,因此代理对象可以完全替代目标对象,执行与目标对象相同的操作。基于接口的动态代理是指代理类和目标对象实现了相同的接口,代理类在实现接口方法时,通过反射机制调用目标对象的对应方法。动态代理是Java语言中一种非常重要的技术,它允许我们在运行时动态地创建代理对象,从而实现对目标对象的代理操作。

weixin_70320260的博客 3316

ADS基础教程24 - Gerber文件的导入

一、引言二、基本概念1.仿真文件下载2.仿真文件介绍二、导入步骤1.新建workspace2.选择Layout结构3.导入设计4.选择文件类型5.导入文件6.预览文件内容7.铜皮离散问题四、总结选择。通过本文章结束,可以了解ADS中如何将导入Gerber文件,并且对导入的铜皮进行合并。下一步就针对导入的文件进行层叠设置和编辑。END!}}END!

XZ_ZC的博客 3053

Spring选择哪种方式代理?

如果类已经实现了接口,就用 jdk 的动态代理即可,如果没有实现接口,就需要用子类的形式,采用 cglib 动态代理。:JDK 动态代理使用java.lang.reflect.Proxy类和相关的InvocationHandler接口来创建代理对象。:CGLIB 代理适用于没有实现接口的类,或者需要代理类中的所有方法(包括那些没有在接口中定义的方法)。:CGLIB 代理使用字节码生成技术,在运行时生成目标类的子类,并在子类中拦截方法调用。好的,面试官,动态代理的方式主要是。:代理对象是目标对象实现的。

埃泽漫笔 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

Spring的代理方式有哪些

Spring的代理方式有两种 a.若目标对象实现了若干接口,spring使用JDK的动态代理。 优点:因为有接口,所以使系统更加松耦合 缺点:为每一个目标类创建接口 b.若目标对象没有实现任何接口,spring使用CGLIB库生成目标对象的子类。 优点:因为代理类与目标类是继承关系,所以不需要有接口的存在。 缺点:因为没有使用接口,所以系统的耦合性没有使用JDK的动态代理好。 ...

a1083960595的博客 1710

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

spring两种代理方式

使用net.sf.cglib.proxy.Enhancer类和net.sf.cglib.proxy.MethodInterceptor接口来实现。Spring 提供了两种主要的代理(proxy)方式,分别是基于JDK动态代理和基于CGLIB的代理。- 生成的代理类是目标类的子类,可能会有一些不兼容的情况(例如目标类是final类,或者目标方法是final方法时无法代理)。- 使用CGLIB代理时,不需要接口,适用于需要代理具体类的方法的场景。- 生成的代理类是接口的实现类,遵循面向接口编程的原则。

ruky36的专栏 809

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

Spring-Aop的两种代理方式

Spring-Aop两种代理方式: 1、JDK动态代理:用于目标类实现了接口; 2、Cglib动态代理:用于目标类没有实现接口; spring会依据目标类是否实现接口来选择使用哪种代理方式(目标类:相当于需要被增强的类); 模拟场景:目标类:步兵类,需要上战场打仗(手提精心打造的木棍) 通知类(增强类):高级商店类,只要有士兵来就免费提供(精心打造的暴风大剑) 代理工厂类:需要一个士兵...

weixin_30955341的博客 195

spring代理方式

Spring代理有两种方式, 一种时对接口的代理, 另一种是才用CGLIB代理方式, 对接口的代理是JDK采用的代理方式,但在没有接口的情况下Srping通过设置proxyTargetClass等于 true来使用CGLIB代理,CGLIB是一种面向继承的代理方式。同时还有一个proxyTarget属性用来指定代理的目标对象类。

知至智 1503

Spring AOP的3种创建代理方式

前言 Spring AOP是大家都非常熟悉的一个概念,在Spring家族体系中扮演着举足轻重的作用。 然后Spring作为一个优秀的框架,提供了多种应用层面上代理的方式:ProxyFactoryBean、ProxyFactory、AspectJProxyFactory 注意:此处这里指的是Spring提供的应用层得方式,并不是指的底层实现方式。底层实现方式现在只有业界都熟悉的两种:JDK动态代理...

clyu的博客 3000

spring的自动代理的方式

自动创建代理(基于后处理Bean.在Bean创建的过程中完成的增强.生成Bean就是代理.) BeanNameAutoProxyCreator :按名称生成代理 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xm...

缥缈 491

Spring 中对象的代理方式详解

必须等 Bean 完全创建好,才能知道它的类、方法、注解(如AOP 需要基于切面(Advisor)匹配目标方法,这些信息只有在 Bean 完全初始化后才能准确获取。代理对象要“替换”原始对象,所以必须在放入容器前完成。

2402_87283759的博客 882

SpringBoot/Spring AOP默认动态代理方式

Spring Boot 2.x中AOP默认使用CGLIB代理而非JDK动态代理,主要原因是CGLIB能避免类型转换异常,支持无接口类代理。可通过配置spring.aop.proxy-target-class=false切换回JDK代理,但仅对实现接口的类有效。JDK代理基于接口,CGLIB基于继承,final类无法被CGLIB代理。该变化解决了JDK代理必须依赖接口的限制,提升了AOP的适用性。

myli92的博客 8589

spring中动态代理的两种方式

原文在上一篇中我们已经介绍了AOP相关的知识,并且了解了spring是通过动态代理的方式实现AOP逻辑的。在spring中动态代理也分为两种一种是JDK动态代理,一种是CGLib动态代理。下面我们看一下这两种动态代理的区别。我们首先看一下在没有动态代理时,添加事物的的逻辑处理,也就上一篇中的事例。虽然上述代码已经实现了我们的逻辑,但是在上一篇中我们已经介绍过了,上述代码的问题就是会有重复的有关事物的代码添加到业务类中,这样很不方便维护。解决的办法就是通过AOP方式来解决,下面我们分别采用JDK动态代理和CG

ss810540895的博客 3736
上一篇: Java中线程通信协作
下一篇: Servlet中的编码
午-夜
博客等级 码龄12年 95粉丝 133原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值