Spring JDK动态代理

JDK 动态代理是通过 JDK 中的 java.lang.reflect.Proxy 类实现的。下面通过具体的案例演示 JDK 动态代理的使用。

1. 创建项目
在 MyEclipse 中创建一个名称为 spring 的 Web 项目,将 Spring 支持和依赖的 JAR 包复制到 Web 项目的 WEB-INF/lib 目录中,并发布到类路径下。

2. 创建接口 CustomerDao
在项目的 src 目录下创建一个名为 com.mengma.dao 的包,在该包下创建一个 CustomerDao 接口,编辑后如下所示。

package com.mengma.dao;public interface CustomerDao {public void add(); // 添加public void update(); // 修改public void delete(); // 删除public void find(); // 查询
}

3. 创建实现类 CustomerDaoImpl
在 com.mengma.dao 包下创建 CustomerDao 接口的实现类 CustomerDaoImpl,并实现该接口中的所有方法,如下所示。
package com.mengma.dao;

public class CustomerDaoImpl implements CustomerDao {@Overridepublic void add() {System.out.println("添加客户...");}@Overridepublic void update() {System.out.println("修改客户...");}@Overridepublic void delete() {System.out.println("删除客户...");}@Overridepublic void find() {System.out.println("修改客户...");}
}

4. 创建切面类 MyAspect
在 src 目录下,创建一个名为 com.mengma.jdk 的包,在该包下创建一个切面类 MyAspect,编辑后如下所示。

package com.mengma.jdk;public class MyAspect {public void myBefore() {System.out.println("方法执行之前");}public void myAfter() {System.out.println("方法执行之后");}
}

上述代码中,在切面中定义了两个增强的方法,分别为 myBefore() 方法和 myAfter() 方法,用于对目标类(CustomerDaoImpl)进行增强。

5. 创建代理类 MyBeanFactory
在 com.mengma.jdk 包下创建一个名为 MyBeanFactory 的类,在该类中使用 java.lang.reflect.Proxy 实现 JDK 动态代理,如下所示。

package com.mengma.jdk;import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;import com.mengma.dao.CustomerDao;
import com.mengma.dao.CustomerDaoImpl;public class MyBeanFactory {public static CustomerDao getBean() {// 准备目标类final CustomerDao customerDao = new CustomerDaoImpl();// 创建切面类实例final MyAspect myAspect = new MyAspect();// 使用代理类,进行增强return (CustomerDao) Proxy.newProxyInstance(MyBeanFactory.class.getClassLoader(),new Class[] { CustomerDao.class }, new InvocationHandler() {public Object invoke(Object proxy, Method method,Object[] args) throws Throwable {myAspect.myBefore(); // 前增强Object obj = method.invoke(customerDao, args);myAspect.myAfter(); // 后增强return obj;}});}
}

上述代码中,定义了一个静态的 getBean() 方法,这里模拟 Spring 框架的 IoC 思想,通过调用 getBean() 方法创建实例,第 14 行代码创建了 customerDao 实例。

在目标类方法执行的前后,分别执行切面类中的 myBefore() 方法和 myAfter() 方法。

6. 创建测试类 JDKProxyTest
在 com.mengma.jdk 包下创建一个名为 JDKProxyTest 的测试类,如下所示。

package com.mengma.jdk;import org.junit.Test;
import com.mengma.dao.CustomerDao;public class JDKProxyTest {@Testpublic void test() {// 从工厂获得指定的内容(相当于spring获得,但此内容时代理对象)CustomerDao customerDao = MyBeanFactory.getBean();// 执行方法customerDao.add();customerDao.update();customerDao.delete();customerDao.find();}
}

上述代码中,在调用 getBean() 方法时,获取的是 CustomerDao 类的代理对象,然后调用了该对象中的方法。

7. 运行项目并查看结果
使用 JUnit 测试运行 test() 方法,运行成功后,控制台的输出结果如下图所示。
在这里插入图片描述
从输出结果中可以看出,在调用目标类的方法前后,成功调用了增强的代码,由此说明,JDK 动态代理已经实现。

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

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

相关文章

澄海哪里学机器人编程_少年学机器人编程

​当今社会,唯有能者居之,说的是有技能在手的人可以立足于职场,格物斯坦表示:现代化的教育方式有很多,其中有一种机器人编程教育模式,青少年们学好了,以后中考、高考核就业比同龄人更有优势了。…

Spring CGLlB动态代理

JDK 动态代理使用起来非常简单,但是有一定的局限性,这是因为 JDK 动态代理必须要实现一个或多个接口,如果不希望实现接口,则可以使用 CGLIB 代理。 CGLIB(Code Generation Library)是一个高性能开源的代码…

更新fielddata为true_在pytorch中停止梯度流的若干办法,避免不必要模块的参数更新...

在pytorch中停止梯度流的若干办法,避免不必要模块的参数更新2020/4/11 FesianXu前言在现在的深度模型软件框架中,如TensorFlow和PyTorch等等,都是实现了自动求导机制的。在深度学习中,有时候我们需要对某些模块的梯度流进行精确地…

php 自动切图,前端工程师技能之photoshop巧用系列扩展篇自动切图

目录[1]初始设置 [2]自动切图前面的话随着photoshop版本的不断升级,软件本身增加了很多新的功能,也为切图工作增加了很多的便利。photoshop最新的版本新增了自动切图功能,本文将详细介绍photoshop的这个新功能初始设置当然首先还是要进行一些…

Spring通知类型及使用ProxyFactoryBean创建AOP代理

Spring 通知类型 通知(Advice)其实就是对目标切入点进行增强的内容,Spring AOP 为通知(Advice)提供了 org.aopalliance.aop.Advice 接口。 Spring 通知按照在目标类方法的连接点位置,可以分为以下五种类型…

matlab二维谐振子,基于有限差分法求解的二维谐振子的MATLAB程序如下。哪位大神能帮我做个注明啊,完全看不懂啊,,急...

基于有限差分法求解的二维谐振子的MATLAB程序如下。哪位大神能帮我做个注明啊,完全看不懂啊,,急0____丿呆呆丶2017.04.15浏览20次分享举报tic clc clear L20; W20; N20; M20; hxL/(2*N); hyW/(2*M); Szeros((2*M-1)*(2*N-1)); for m1:2*M-1 D…

typescript get方法_.NET手撸绘制TypeScript类图——上篇

.NET手撸绘制TypeScript类图——上篇近年来随着交互界面的精细化,TypeScript越来越流行,前端的设计也越来复杂,而类图正是用简单的箭头和方块,反映对象与对象之间关系/依赖的好方式。许多工具都能生成C#类图,有些工具也…

Spring使用AspectJ开发AOP

AspectJ 是一个基于 Java 语言的 AOP 框架,它扩展了 Java 语言。Spring 2.0 以后,新增了对 AspectJ 方式的支持,新版本的 Spring 框架,建议使用 AspectJ 方式开发 AOP。 使用 AspectJ 开发 AOP 通常有两种方式: 基于 …

matlab特征方程的根,MATLAB 求解特征方程的根轨迹图稳定性分析

原文:http://tecdat.cn/?p3871根轨迹分析在下文中,我们提供了用于根轨迹分析的强大MATLAB命令的简要描述。读者可能想知道为什么当强大的MATLAB命令可用时,教师强调学习手工计算。对于给定的一组开环极点和零点,MATLAB立即绘制根…

python如何把一张图像的所有像素点的值都显示出来_情人节,教你用 Python 向女神表白...

点击上方 “AirPython”,选择 “加为星标”第一时间关注 Python 技术干货!2020年,这个看起来如此浪漫的年份,你还是一个人吗?难不成我还能是一条狗?提醒你一下,后天就是 2月14日了。什么&#x…

Spring事务管理接口

Spring 的事务管理是基于 AOP 实现的,而 AOP 是以方法为单位的。Spring 的事务属性分别为传播行为、隔离级别、只读和超时属性,这些属性提供了事务应用的方法和描述策略。 在 Java EE 开发经常采用的分层模式中,Spring 的事务处理位于业务逻…

倒计时小工具_送你3个倒数计日的小程序,让你不再遗忘重要事

每天我们忙于工作,忙于生活,在很多重要事情,重要人的生日,以及重要有意义的日子总会在忙碌中被遗忘,那么这该怎么办呢?别紧张,小编为你带来3个倒数计日的小程序,让你不再遗忘重要事情…

Spring声明式事务管理

Spring 的事务管理有两种方式:一种是传统的编程式事务管理,即通过编写代码实现的事务管理;另一种是基于 AOP 技术实现的声明式事务管理。由于在实际开发中,编程式事务管理很少使用,所以我们只对 Spring 的声明式事务管…

无法检查指定的位置是否位于cfs上_打印机知识普及:七大原因导致的打印机无法打印及解决方法...

打印机无法打印的原因有很多,如果我们遇到打印机无法打印应该首先从简单到复杂入手。首先必须排除一些最简单的问题,比如打印机是否正常安装。另外打印机内部是不是已经放置有墨盒以及打印纸等,这些基本问题必须排除,另外还有一个…

Spring基于Annotation实现事务管理

在 Spring 中,除了使用基于 XML 的方式可以实现声明式事务管理以外,还可以通过 Annotation 注解的方式实现声明式事务管理。 使用 Annotation 的方式非常简单,只需要在项目中做两件事,具体如下。 1 在 Spring 容器中注册驱动&…

python扩展,用python扩展列

我试图在python中扩展数据帧的某一列。在r中,我将使用这个函数:在python中,我发现df.pivot_table(),但我刚发现一个错误:pandas.pivot_table(df, values Value, index[Day, Money, Product],columns[Account])^更新结果:数据帧没有更改。它只返回相同的数据文件而不进行扩展。考…

基于matlab的pcm系统仿真_深入理解基于RISC-V ISS Spike的仿真系统:探索Spike,pk和fesrv...

Spike, the RISC-V ISA Simulator, implements a functional model of one or more RISC-V processors.Spike is named after the golden spike used to celebrate the completion of the US transcontinental railway.一些同学初接触RISC-V,总逃脱不了被Rocketchip…

单机安装oracle,单机安装oracle系统

一、安装oracle6.9操作系统1、硬盘划分为30G(以下分区皆强制为主分区)/boot 200Mswap 4G/ 剩余全部空间安装下一步的步骤就不说了勾选图形选项基本系统--》备份客户端,大系统性能,存储工具,安全工具,性能工具,目录客户…

redis timeout设置多少合适_热水器怎么调温度?一般热水器温度设置多少度比较合适?...

对于热水器的温度设置您知道怎么操作吗?一般情况下电热水器设置多少度比较合适呢?今天蜜罐蚁装修网小编给大家介绍下热水器如何调节温度,以及热水器调节温度在什么范围比较合适。下面请看小编以美的电热水器某个型号产品举例图文讲解热水器调…

用swing设计一个打地鼠小游戏_这7个风靡欧美的英语小游戏,学会胜过刷100道题!...

精彩导读小编为大家搜罗了一些在国外家喻户晓的语言类小游戏。好的方法胜过刷上100道题,真正让孩子觉得好玩,教学才会事半功倍!01Would You Rather...最近牛津大学的面试考题惊天地爆出了一题:你想要变成吸血鬼还是想要变成僵尸&a…