博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring框架的AOP的底层实现之JDK的动态代理(代码了解,理解原理)
阅读量:4612 次
发布时间:2019-06-09

本文共 1964 字,大约阅读时间需要 6 分钟。

1.创建接口UserDao:

package com.huida.demo1;public interface UserDao {    public void save();    public void update();}

2.创建实现接口的类UserDaoImpl:

package com.huida.demo1;public class UserDaoImpl implements UserDao {    @Override    public void save() {        System.out.println("保存用户...");    }    @Override    public void update() {        System.out.println("修改用户...");    }}

3.编写代理对象类:

package com.huida.demo1;import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;/* * 传一个对象返回一个代理对象 */public class MyProxyUtils {    public static UserDao getProxy(UserDao dao){
//这里传的参数为最大的接口,所以凡是它的子类均可传入,范围更大 //使用proxy类生成代理对象 /* * 参数: * loader:类加载器 dao.getClass().getClassLoader * interfaces:接口 子类对象获取它所实现的接口 * h:回调函数 */ UserDao proxy=(UserDao) Proxy.newProxyInstance(dao.getClass().getClassLoader(), dao.getClass().getInterfaces(),new InvocationHandler() { //回调函数:代理对象一执行,invoke方法就会执行 @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { //System.out.println("aaaaaaaaaa"); //对功能进行增强 if("save".equals(method.getName())){ System.out.println("记录日志..."); } return method.invoke(dao, args); } }); //返回代理对象 return proxy; }}

4.编写测试代码:

package com.huida.demo1;import org.junit.Test;public class demo1 {    @Test    public void run1(){        UserDao dao=new UserDaoImpl();        dao.save();        dao.update();        System.out.println("-------------------");        //使用工具类获取代理对象        UserDao proxy=MyProxyUtils.getProxy(dao);//MyProxyUtils是UserDao的一个子类        //每调用一次接口里面的方法,就会一次回调代理对象中的方法        proxy.save();        proxy.update();    }}

5.单元测试run1方法,运行结果为:

通过回调函数对函数功能进行了增强,在保存用户之前输出了“记录日志”。

 

转载于:https://www.cnblogs.com/wyhluckdog/p/10130795.html

你可能感兴趣的文章
Linux下启动mongodb(后台方式)
查看>>
opencv 播放视频
查看>>
Spring+redis
查看>>
第二次作业
查看>>
8个惊艳的JavaScript 为 HTML5 Canvas 提供硬件3D加速渲染应用实验
查看>>
js与设计模式----转一个前言
查看>>
msc pool概念
查看>>
Oracle性能优化
查看>>
CLR via 笔记4.2 类型转换 is 与 as 区别
查看>>
初探C++11之lambda表达式
查看>>
【OpenCV归纳】3 在实例中学习简单函数以及数据读写
查看>>
Rotate Array
查看>>
为什么我要写自己的框架?
查看>>
Virtualbox虚拟机安装CentOS6.5图文详细教程(zhuan)
查看>>
Jump Game II
查看>>
solr学习笔记二-------solr query查询的参数
查看>>
常用的内置模块
查看>>
[Flex] 组件Tree系列 —— 实现右键拓展功能
查看>>
《走近心理学》第二章之心理学的生物学理论
查看>>
【前端重构技能天赋】(三)——最终篇
查看>>