当前位置: 首页 > news >正文

aop的几种动态代理以及简单案例(1)

Sping AOP是通过动态代理模式实现的,具体有两种实现方式,一种是基于Java原生的动态代理,一种是基于cglib的动态代理。

1.jdk动态代理

1.1创建需要被代理的方法接口

public interface TargetInteface {void method1();void method2();int method3(Integer i);
}

1.2实现编写方法逻辑

public class Target implements TargetInteface {@Overridepublic void method1() {System.out.println("method1 running ...");}@Overridepublic void method2() {System.out.println("method2 running ...");}@Overridepublic int method3(Integer i) {System.out.println("method3 running ...");return i;}
}

1.3使用springProxy创建代理对象代理该类,在每次调用方法前后写入要进行的逻辑

public class TargetProxy {public static  <T> Object getTarget(T t) {//新构建了一个 新的 代理类的对象return Proxy.newProxyInstance(t.getClass().getClassLoader(), t.getClass().getInterfaces(), (proxy, method, args) -> {// proxy就是目标对象t,method就是调用目标对象中方法,args就是调用目标对象中方法的参数。//比如说:代理对象.method1(),这时proxy就是目标类,method1就是method,args就是method1方法参数。System.out.println("执行方法前...");Object invoke = method.invoke(t, args);System.out.println("执行方法后...");return invoke;
});}
}

1.4 使用该代理方法代理实现类

    public static void main(String[] args) {TargetInteface target = (TargetInteface) TargetProxy.getTarget(new Target());target.method1();System.out.println("-----------------------------");target.method2();System.out.println("-----------------------------");System.out.println(target.method3(3));}

2.cglib动态代理

2.1创建需要被代理的对象

public class Target {public void method1() {System.out.println("method1 running ...");
}public void method2() {System.out.println("method2 running ...");}public int method3(Integer i) {System.out.println("method3 running ...");return i;}
} 

2.2创建代理方enhancer代理该类

public class TargetProxy {public static <T> Object getProxy(T t) {Enhancer en = new Enhancer(); //帮我们生成代理对象en.setSuperclass(t.getClass());//设置要代理的目标类en.setCallback(new MethodInterceptor() {//代理要做什么@Overridepublic Object intercept(Object object, Method method, Object[] args, MethodProxy methodProxy) throws Throwable {System.out.println("执行方法前。。。");//调用原有方法  Object invoke = methodProxy.invokeSuper(object, args);// Object invoke = method.invoke(t, args);// 作用等同与上面。System.out.println("执行方法后。。。");return invoke;}});return en.create();}
}

2.3生成代理对象使用方法

   public static void main(String[] args) {Target target = (Target) TargetProxy.getProxy(new Target());System.out.println(target.getClass().getName());target.method1();print(target);}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • nginx配置ssl证书
  • JavaWeb__正则表达式
  • 27. 738.单调递增的数字,968.监控二叉树,贪心算法总结
  • 访问控制列表
  • linux 常用和不那么常用命令记录02 磁盘占用
  • 开源项目的机遇与挑战
  • 设计分享—国外后台界面设计赏析
  • 视频号的视频,一键就下载了,方法全在这儿了!
  • STM32智能无人机控制系统教程
  • 【D3.js in Action 3 精译】D3 入门基础之 Node、JavaScript 框架与 Observable 记事本
  • stm32基本定时器
  • 认证和授权类漏洞挖掘指南
  • uniapp 封装瀑布流组件
  • H5与小程序:两者有何不同?
  • 【Java 注解,自定义注解,元注解,注解本质,注解解析】
  • eclipse的离线汉化
  • Electron入门介绍
  • ES6核心特性
  • Java 最常见的 200+ 面试题:面试必备
  • Java小白进阶笔记(3)-初级面向对象
  • Linux编程学习笔记 | Linux多线程学习[2] - 线程的同步
  • Mac 鼠须管 Rime 输入法 安装五笔输入法 教程
  • MySQL用户中的%到底包不包括localhost?
  • Nodejs和JavaWeb协助开发
  • Python_网络编程
  • Python十分钟制作属于你自己的个性logo
  • Solarized Scheme
  • 持续集成与持续部署宝典Part 2:创建持续集成流水线
  • 第三十一到第三十三天:我是精明的小卖家(一)
  • 分享一份非常强势的Android面试题
  • - 概述 - 《设计模式(极简c++版)》
  • 解析带emoji和链接的聊天系统消息
  • 警报:线上事故之CountDownLatch的威力
  • 力扣(LeetCode)21
  • 免费小说阅读小程序
  • 我这样减少了26.5M Java内存!
  • 原生 js 实现移动端 Touch 滑动反弹
  • # windows 安装 mysql 显示 no packages found 解决方法
  • # 利刃出鞘_Tomcat 核心原理解析(二)
  • $Django python中使用redis, django中使用(封装了),redis开启事务(管道)
  • (1/2) 为了理解 UWP 的启动流程,我从零开始创建了一个 UWP 程序
  • (2)(2.10) LTM telemetry
  • (6)设计一个TimeMap
  • (Oracle)SQL优化技巧(一):分页查询
  • (阿里云在线播放)基于SpringBoot+Vue前后端分离的在线教育平台项目
  • (安卓)跳转应用市场APP详情页的方式
  • (附源码)spring boot车辆管理系统 毕业设计 031034
  • (十三)Flink SQL
  • (四)React组件、useState、组件样式
  • (转) Android中ViewStub组件使用
  • (转)程序员技术练级攻略
  • .Net Core webapi RestFul 统一接口数据返回格式
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net on S60 ---- Net60 1.1发布 支持VS2008以及新的特性
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则