Spring aop利用jdk的InvocationHandler产生动态代理

Java Proxy 和 CGLIB 动态代理原理 动态代理在Java中有着广泛的应用,比如Spring AOP,RPC,Java注解对象获取等。静态代理的代理关系在编译时就确定了,而动态代理的代理关系是在编译期确定的。静态代理实现简单,适合于代理类较少且确定的情况,而动态代理则给我们提供了更大的灵活性。今天我们来探讨Java中两种常见的动态代理方式:JDK原生动态代理和CGLIB动态代理。 JDK原生动态代理 先从直观的示例说起,假设我们有一... 阅读详情

笔记之用……

首先有一个接口UserService

 

package com.spring.test;

import org.springframework.stereotype.Component;

@Component
public interface UserService {
	
	public void createUser();
	
	public void deleteUser();
	
	public void updateUser(int id);

}

UserDao实现UserService

 

 

package com.spring.test;

import org.springframework.stereotype.Component;

@Component
public class UserDao implements UserService {

	public void createUser() {
		System.out.println("user saved...");

	}
	
	public void deleteUser(){
		System.out.println("delete user...");
	}
	
	public void updateUser(int id){
		System.out.println("update user...");
	}

}

 

想要在这些方法执行的时候加一些业务逻辑,如公共日志或者计算方法执行前后的时间等,将代码以切面的形式切入到方法中,此时可以用动态代理来实现,

aop的动态代理底层是用jdk的动态代理实现的proxy和InvocationHandler,需实现 java.lang.reflect.InvocationHandler

首先定义一个LogInteceptor来实现InvocationHandler:

 

package com.spring.log;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.util.Calendar;
import java.util.Date;

/*****************
 * 日志类
 * 
 * @author Administrator
 * 
 */
public class LogInteceptor implements InvocationHandler{

	private Object target;//被代理的对象
	
	public Object getTarget() {
		return target;
	}

	public void setTarget(Object target) {
		this.target = target;
	}

	public Object invoke(Object proxy, Method method, Object[] args)
			throws Throwable {
		beforeMethod(method);//在方法执行前所要执行的业务逻辑
		long starttime=System.currentTimeMillis();
		method.invoke(target, args);
		long result=System.currentTimeMillis()-starttime;
		System.out.println("执行时间为:"+result+"毫秒");
		afterMethod(method);//在方法执行后所要执行的业务逻辑
		return null;
	}
	
	public void beforeMethod(Method m){
		System.out.println(m.getName()+"执行before....");
	}
	
	public void afterMethod(Method m){
		System.out.println(m.getName()+"执行after...");
	}

}

然后用JUnit来进行测试

 

 

package com.junit.test;

import java.lang.reflect.Proxy;

import com.spring.log.LogInteceptor;
import com.spring.test.UserDao;
import com.spring.test.UserService;


public class Test {
	
	
	@org.junit.Test
	public void testProxy(){
		
		UserDao userDao=new UserDao();//被代理的对象
		LogInteceptor logInteceptor=new LogInteceptor();//获取日志的InvocationHandler
		logInteceptor.setTarget(userDao);//把被代理的对象设为userDao
		
		//设置代理对象,参数1:被代理对象的classloader,参数2:被代理对象所实现的接口(该对象必须要实现接口,不然无法产生代理),参数3:指定处理的InvocationHandler
		UserService userService=(UserService)Proxy.newProxyInstance(userDao.getClass().getClassLoader(), new Class[]{UserService.class}, logInteceptor);
		userService.createUser();//执行方法
		userService.deleteUser();//执行方法
		userService.updateUser(1001);//执行方法
	}

}

 

执行结果:

createUser执行before....
user saved...
---执行时间为:0毫秒
createUser执行after...
deleteUser执行before....
delete user...
---执行时间为:0毫秒
deleteUser执行after...
updateUser执行before....
update user...
---执行时间为:0毫秒
updateUser执行after...

接下来来点实际的..........................

定义一个LogInterceptor,让dao里的方法在执行的前后执行某些特定的方法

 

package com.spring.log;

public class LogInterceptor {
	
	public void beforeMethod(){
		System.out.println("方法执行前执行");
	}
	
	public void afterMethod(){
		System.out.println("方法执行后执行");
	}

}

定义的beforeMethod和afterMethod在applicationContext.xml里用aop配置

 

 

<bean id="mylog" class="com.spring.log.LogInterceptor"></bean>
	<aop:config>
		<aop:aspect id="log" ref="mylog">
			<aop:pointcut expression="execution (* com.spring.test.*.*(..))" id="point" /><!--切入点-->
			<aop:before method="beforeMethod"  pointcut-ref="point"/><!-- 定义方法before前执行自己定义的beforeMethod -->
			<aop:after method="afterMethod" pointcut-ref="point"/><!-- 定义方法after后执行自己定义的afterMethod -->
		</aop:aspect>
	</aop:config>

 

当然还可以配置

 

<aop:around method=""/>
<aop:after-returning method=""/>
<aop:after-throwing method=""/>

最后用JUnit测试:

 

 

@org.junit.Test
	public void Test(){
		ApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
		UserService service = (UserService) ctx.getBean("userDao");
		service.createUser();
	}

执行结果:

 

方法执行前执行
user saved...
方法执行后执行

Java反射与动态代理异常处理:UndeclaredThrowableException原理与解决方案 在Java开发中,反射机制和动态代理是实现AOP、框架拦截等高级特性的核心技术。反射允许程序在运行时动态调用方法,而动态代理则通过InvocationHandler在方法调用前后插入逻辑。这些技术虽然强大,但也带来了异常处理的复杂性:当通过代理调用的方法抛出的异常类型不符合接口或父类方法声明的throws子句时,JVM会抛出UndeclaredThrowableException进行包装。这一机制确保了方法签名的契约完整性,但给开发者调试带来了挑战。其技术价值在于维护了Java类型系统的安全性,防止未声明的 阅读详情

相关推荐

Spring Aop JDK动态代理实现原理分析(源码)

1、spring 的aop作用 spring 的aop的动态代理都是为了给实现了接口的类做增强(必须是实现了接口),比如增加日志的功能。 2、本文对你的收获: 我们从这个文章中应该能知道生成的代理对象是什么样的;同时就能知道代理对象对象方法执行流程, 首先我们看下代理后的对象张什么样,其中ConfigInterface是我们需要代理的对象。 // // Source code rec...

小样 1884

Spring AOP 实例解析(InvocationHandler 的invoke的proxy 参数作用)

InvocationHandler 的invoke的proxy 参数作用

立身以力学为先,力学以读书为本。 —郑耕老《劝学》 753

Spring入门到精通:第四章 AOP:3.AOP底层原理-JDK动态代理实现

这节我们通过JDK动态代理来对Spring AOP有一个更深的了解。 一、JDK动态代理类 Java动态代理类位于java.lang.reflect包下,一般主要涉及到以下两个类: (1)Interface InvocationHandler:该接口中仅定义了一个方法 public Object invoke(Object proxy, Method method, Object[] args) 在实际使用时,第一个参数proxy一般是指代理类,method是被代理的方法,args...

悟纤学院 1万+

Java动态代理与Spring AOP中的Cglib动态代理详解

在Java编程中,动态代理是一种在运行时动态创建代理类及其对象的技术。通过动态代理,我们可以在不修改原有类代码的情况下,为这些类添加新的行为或功能。Java提供了两种主要的动态代理机制:基于接口的Java动态代理和基于类的Cglib动态代理。在Spring AOP(面向切面编程)中,Cglib动态代理扮演着重要角色。本文将详细讨论这两种动态代理的实现。

dazhong2012的专栏 2023

AOP 动态代理(Proxy invocationHandler)

AOP 动态代理(Proxy invocationHandler),Spring的动态代理的介绍

LLC同步整流实战:从驱动时序到调试仿真,效率提升与避坑指南

同步整流技术是提升开关电源效率的关键手段,尤其在LLC谐振变换器中,通过低导通电阻MOSFET替代二极管可显著降低副边整流损耗。然而,驱动时序、电流过零检测及轻载模式切换是工程实践中的核心难点。从Vds检测原理到死区调节,再到仿真与实测验证,工程师需掌握完整的调试方法论。该技术广泛应用于通信电源、服务器电源及车载DC/DC,合理设计LLC同步整流方案能实现满载效率提升约1.8个百分点,同时优化热分布。本文以600W半桥LLC样机为线索,深入分析工作模态、驱动芯片选型、波形判断与仿真模型搭建,为电源设计提供可

weixin_29165465的博客 294

Spring AOP术语解释和动态代理

1 AOP术语1.1 连接点(JoinPoint)类或者方法中具有边界性质的特定点(eg:类初始化前后,方法调用前后,方法抛出异常后),可以理解成为位置,只不过该位置是针对方法并且范围不精确。Spring仅支持方法级的连接点即仅能在方法调用前后,方法抛出异常时将对应的增强织入。连接点包含两个方面的信息:1.用方法表示的程序执行点即方法 2.用执行点的相对位置表示方位即方法调用前的位置。add(.....

Mark_Li 498

Deep Reinforcement Learning - 1. DDPG原理和算法

Deep Reinforcement Learning - 1. DDPG原理和算法 背景描述 DDPG的定义和应用场景 DDPG算法相关基本概念定义 DDPG实现框架和算法 DDPG对于DPG的关键改进 下一篇 以下用RL作为Reinforcement Learning 的简称。背景描述概括来说,RL要解决的问

kenneth_yu的博客 14万+

JDK动态代理介绍与使用

一、介绍   JDK动态代理是代理模式的一种实现方式。因为它是基于接口来做代理的,所以也常被称为接口代理。在JDK动态代理中有两个重要的角色: InvocationHandler(Interface) 用户实现这个接口,用来编写代理类处理的核心逻辑。 Proxy(Class) 用来创建一个代理实例,此时需要用到上面自定义的InvocationHandler。 二、功能   动态代理拥有代理模式的基本功能,如:调用真实方法的预处理、模块化通用功能。除此之外,还可以在运行时动态创建代理对象,无需针对每个接口

咔咔学长 1010

手把手教你使用transciver-ip核的配置

手把手教你使用transciver-ip核的配置

u012938458的博客 5411

iphone查看/private/var/mobile/Containers/Data/Application/文件

xcode查看iPhone的private/var/文件夹xcode连接iPhone真机选择app下载Containers文件夹到mac电脑中查看手机中下载的文件 使用xcode真机调试的时候,文件目录都是这种/private/var/mobile/Containers/Data/Application/FAEFDF4D-5CE4-474F-9C53-C19789DB59F6/tmp/ xcode连接iPhone真机 不需要越狱,使用xcode上连接iPhone,然后选择运行的app,选择window-&g

小手琴师的博客 101万+

代理模式及JDK动态代理(InvocationHandler)的简单实现与分析

在慕课网上学习了讲解代理模式的一个课程--《模式的秘密--代理模式》,感叹于David老师屌炸天的PPT,同时,老师一步一步模仿JDK源码去写code,教我们去简单实现JDK中的动态代理,讲的清晰透彻。在此我做下笔记,课程原地址:http://www.imooc.com/learn/214

@毛宏斌 8593

中文翻译《ASPICE in practice》之“SUP.8 配置管理”

一般来说,自动化程度越低,负责 CM 的个人就必须花费越多的精力,例如,检查基线的正确性和完整性,或确保在归档系统上正确完成手动版本控制。必须防止未经许可的访问。为了唯一地标识基线,许多 CM 工具提供了一种“标记”基线的机制,即为受影响的 CM 项目的所有版本分配相同的标签,例如“第 3 次交付状态”。此选择必须允许绘制合格的基线(参见 BP5),即确保实际上所有描述特定开发阶段的元素(需求和设计文档、开发环境、变更请求、测试用例、测试文档,也可能是重要的中间工作产品等)都可以在 CM 系统中进行基线。

Smith_Chai的博客 1583

深度解析 Spring 源码:揭秘JDK动态代理的奥秘

在Spring框架中,JDK动态代理是实现AOP(面向切面编程)的核心机制之一。本文将深入解析Spring源码,揭秘JDK动态代理的奥秘,帮助读者理解其工作原理和实现方式。 JDK动态代理利用反射机制,在运行时动态地创建一个符合特定接口的代理类。当调用代理对象的方法时,实际上会调用代理类的invoke方法,由invoke方法来调用目标对象的方法。这种机制使得我们可以在不修改原有代码的情况下,对方法进行增强和扩展。本文将带领读者深入了解Spring中JDK动态代理的实现原理,掌握其核心概念和编程技巧。

忆~遂愿的博客 3358

安信可TB蓝牙模组系列 实战Ble Mesh智能照明系统搭建

本文详细介绍了如何使用安信可TB蓝牙模组系列搭建Ble Mesh智能照明系统。从硬件准备、固件烧录到手机APP组网全流程,提供了实战步骤和优化建议,特别适合智能家居开发者入门。Ble Mesh的自组网能力解决了蓝牙传输距离限制,实现全屋灯光智能控制。

weixin_30856725的博客 352

如何设置Xilinx以太网IP核的Pause帧处理

这里要注意,为什么是或,第一个条件是该功能使能取反,也就是说,如果你设置使能不打开的话,这个条件是直接满足的;先来看图中第二句,判断该以太网数据包为Global Pause帧(gpp),首先要满足Step1,然后是由上图中第二句代码(assign global_pause_packet)后面的所有项“与”(&&)起来的,就是说要满足后面所有的项,分别是DA符合,SA符合,Etype符合,Opcode符合,并且使能了该功能(即设置ctl_rx_enable_gpp=1)。如果没通过,则进入Step3。

qq_43416206的博客 617

【Spring Boot】Spring AOP动态代理,以及静态代理

⾃定义 MethodInterceptor 并重写 intercept 方法, intercept ⽤于增强⽬标方法,和JDK动态代理中的 invoke 方法类似//⽬标对象, 即被代理对象 private Object target;// 代理增强内容 System . out . println("我是中介, 开始代理");//通过反射调⽤被代理类的方法 Object retVal = methodProxy . invoke(target , objects);

smile_sundays的博客 4484

双端之Nginx+Php结合PostgreSQL搭建Wordpress

制作的 PG4WP 分支版本,它与所有版本的 WordPress 兼容,解决了原版的一些问题。参数,确保 PostgreSQL 正在监听默认端口(通常是 5432),或者你自定义的端口。:PG4WP 插件存在缺陷和不完整的功能,可能与最新版本的 WordPress 不兼容。的插件,它允许 WordPress 使用 PostgreSQL 数据库。,如果看到 Nginx 的默认欢迎页面,说明 Nginx 已正确安装。,如果看到 Nginx 的默认欢迎页面,说明 Nginx 已正确安装。

宇宙第一小趴菜的博客 1891

聊聊JDK动态代理和CGlib动态代理,AOP代理机制是怎么回事?代理模式详解

摘要: 代理模式通过引入代理对象间接访问目标对象,控制访问并扩展功能。分为静态代理(手动增强方法,灵活性差)和动态代理(运行时生成代理类)。静态代理需为每个目标类单独创建代理类,动态代理则更灵活,包括JDK动态代理(基于接口)和CGLIB动态代理(直接代理类)。示例展示了静态代理的实现步骤,动态代理通过运行时动态生成字节码实现高效扩展。

先做到 再看见 2071

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Spring AOP与动态代理

AOP(Aspect Oriented Programming)意为面向切面编程通过预编译和运行期间动态代理来实现程序功能的统一维护的一种技术。是Spring框架里面一个重要的点。它提供了一种将横切关注点(如日志记录、事务管理、安全性等)与业务逻辑分离的机制。AOP 允许开发者将这些关注点模块化,并在不修改业务逻辑代码的情况下,对业务逻辑进行增强。Spring AOP 基于代理机制实现,它可以在运行时动态地创建目标对象的代理对象。

qq_52295468的博客 2456

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

Spring AOP动态代理的实现方式

"JDK"动态代理和"CGLIB"动态代理 JDK动态代理通过反射来接收被代理的类,并且要求被代理的类必须实现一个接口。JDK动态代理的核心是InvocationHandler接口和Proxy类 CGLIB(Code Generation Library),是一个代码生成的类库,可以在运行时动态的生成某个类的子类,注意,CGLIB是通过继承的方式做的动态代理,因此如果某个类被标记为final,那...

小驴 1万+

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

【JAVA 进阶】Spring AOP核心原理:JDK与CGLib动态代理实战解析

本文深入解析Spring AOP的核心实现技术——JDK动态代理与CGLib动态代理。首先从AOP的概念入手,阐述其解决代码复用痛点的原理,并详细介绍了切面、通知、切入点等核心概念。然后重点剖析JDK动态代理的实现机制,包括InvocationHandler接口和Proxy类的关键作用,通过日志代理的实战案例演示了代理对象的创建过程。文章还对比了两种代理方式的适用场景,帮助开发者理解Spring AOP的整体执行流程和技术选型依据。全文兼顾理论与实战,为掌握Spring AOP提供了全面的技术指南。

CodeSuc 的技术博客 2859

JDK动态代理、Cglib动态代理及Spring AOP

Java中的JDK动态代理是一种通过反射机制生成代理对象的技术,使得我们能够在运行时动态地创建某个接口的代理类,而无需手动编写实现类。JDK动态代理通常用于横切关注点(如日志、事务管理、安全性等)在方法调用前后进行处理,而不需要修改目标类的源代码。JDK 动态代理特点只能代理实现了接口的类或对象。在运行时动态生成代理类,避免了手动创建静态代理类的繁琐。使用简单,适用于代理接口的场景。应用场景:适合需要对接口进行动态代理的场景,如一些简单的业务逻辑。Cglib 动态代理特点。

m0_67391870的博客 1120

【Spring】Spring AOP底层原理:JDK动态代理和CGLIB动态代理

Spring AOP 的实现原理是基于动态代理和字节码操作的。而动态代理是基于反射机制的。 在编译时, Spring 会使用 AspectJ 编译器将切面代码编译成字节码文件。在运行时, Spring 会使用 Java 动态代理或 CGLIB 代理生成代理类,这些代理类会在目标对象方法执行前后插入切面代码,从而实现AOP的功能。

m0_65277261的博客 3709

JDK_Proxy_InvocationHandler_动态代理

本文用jdk动态代理模拟了spring的AOP的实现技术 AOP面向切面编程,可用于权限验证,效率检查,事务,异常管理等 JDK的动态代理主要涉及到java.lang.reflect包中的两个类:Proxy和InvocationHandler。其中 InvocationHandler是一个接口,可以通过实现该接口定义横切逻辑,在并通过反射机制调用目标类的代码,动态将横切逻辑和业务逻辑编织在一 起。而Proxy为InvocationHandler实现类动态创建一个符合某一接口的代理实例 UserDAOImpl

vwinner的博客 1万+
上一篇: Spring Aop配置使用示例及实现过程和原理介绍
下一篇: Spring AOP的底层实现技术 Proxy InvocationHandler
鹿晗的晗
博客等级 码龄16年 22粉丝 23原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值