Spring-Spring之AOP底层原理解析---实践(动态代理)

动态代理

代理模式的解释:其他对象提供一种代理以控制对这个对象的访问,增强一个类中的某个方法,对程序进行扩展。

cglib动态代理 方式一:

public class UserService  {public void test() {System.out.println("test...");}}
UserService target = new UserService();// 通过cglib技术
Enhancer enhancer = new Enhancer();
enhancer.setSuperclass(UserService.class);// 定义额外逻辑,也就是代理逻辑
enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("before...");Object result = methodProxy.invoke(target, objects);System.out.println("after...");return result;}
}});// 动态代理所创建出来的UserService对象
UserService userService = (UserService) enhancer.create();// 执行这个userService的test方法时,就会额外会执行一些其他逻辑
userService.test();

执行结果:

cglib动态代理 方式二

声明两个不同的方法

public class UserService  {public void test() {System.out.println("test...");}public void a() {System.out.println("aaaaa...");}}

添加无任何逻辑的拦截器:NoOp.INSTANCE

然后执行不同的代理方法test() 和a()

public static void main(String[] args) {UserService target = new UserService();// 通过cglib技术Enhancer enhancer = new Enhancer();enhancer.setSuperclass(UserService.class);// 定义额外逻辑,也就是代理逻辑enhancer.setCallbacks(new Callback[]{new MethodInterceptor() {@Overridepublic Object intercept(Object o, Method method, Object[] objects, MethodProxy methodProxy) throws Throwable {System.out.println("before...");
//                Object result = methodProxy.invoke(target, objects);
//                Object result = methodProxy.invokeSuper(o, objects);Object result = method.invoke(target, objects);System.out.println("after...");return result;}}, NoOp.INSTANCE}); //NoOp.INSTANCE为无任何逻辑的拦截器enhancer.setCallbackFilter(new CallbackFilter() {@Overridepublic int accept(Method method) {if(method.getName().equals("test")){return 0; //该数字为上面数组拦截器的下标}else {return 1;}}});// 动态代理所创建出来的UserService对象UserService userService = (UserService) enhancer.create();// 执行这个userService的test方法时,就会额外会执行一些其他逻辑userService.test();//userService.a();}

当代理执行  userService.test();时,结果:

当代理执行  userService.a();时,结果:

JDK动态代理:

基于接口的动态代理

public interface UserInterface {public void test();
}public class UserService implements UserInterface {public void test() {System.out.println("test...");}}
   public static void main(String[] args) {UserService target = new UserService();// UserInterface接口的代理对象Object proxy = Proxy.newProxyInstance(UserService.class.getClassLoader(), new Class[]{UserInterface.class}, new InvocationHandler() {@Overridepublic Object invoke(Object proxy, Method method, Object[] args) throws Throwable {System.out.println("before...");Object result = method.invoke(target, args);System.out.println("after...");return result;}});UserInterface userService = (UserInterface) proxy;userService.test();}

执行结果:

Spring中的动态代理:

ProxyFactory

public class UserService  {public void test() {System.out.println("test...中奖了");}public void a() {System.out.println("aaaaa...");}}
public static void main(String[] args) {  UserService target = new UserService();ProxyFactory proxyFactory = new ProxyFactory();proxyFactory.setTarget(target);proxyFactory.setInterfaces(UserInterface.class);proxyFactory.addAdvice(new MethodInterceptor() {@Overridepublic Object invoke(MethodInvocation invocation) throws Throwable {System.out.println("before...买彩票");Object result = invocation.proceed();System.out.println("after...兑换成功");return result;}});UserInterface userService = (UserInterface) proxyFactory.getProxy();userService.test();}

执行结果:

 Advice的分类

Before Advice:方法之前执行
After returning advice:方法return后执行
After throwing advice:方法抛异常后执行
After (finally) advice:方法执行完finally之后执行,这是最后的,比return更后
Around advice:这是功能最强大的Advice,可以自定义执行顺序

public class UserService  {public void test() {System.out.println("test...中奖了");}public void a() {System.out.println("aaaaa...");}}

 Before Advice:方法之前执行
After returning advice:方法return后执行

After (finally) advice:方法执行完finally之后执行,这是最后的,比return更后
Around advice:这是功能最强大的Advice,可以自定义执行顺序

public class ZsjBeforeAdvice implements MethodBeforeAdvice {@Overridepublic void before(Method method, Object[] args, Object target) throws Throwable {System.out.println("中奖之前,先去买财票");}
}
public class ZsjAfterAdvice implements AfterReturningAdvice {@Overridepublic void afterReturning(Object returnValue, Method method, Object[] args, Object target) throws Throwable {System.out.println("中奖后去兑换财票,换钱");}
}
public static void main(String[] args) {  UserService target = new UserService();ProxyFactory proxyFactory = new ProxyFactory();proxyFactory.setTarget(target);proxyFactory.setInterfaces(UserInterface.class);proxyFactory.addAdvice(new ZsjBeforeAdvice());proxyFactory.addAdvice(new ZsjAfterAdvice());UserInterface userService = (UserInterface) proxyFactory.getProxy();userService.test();}

执行结果:

After throwing advice:方法抛异常后执行

public static void main(String[] args) {  UserService target = new UserService();ProxyFactory proxyFactory = new ProxyFactory();proxyFactory.setTarget(target);proxyFactory.setInterfaces(UserInterface.class);proxyFactory.addAdvice(new ZsjBeforeAdvice());proxyFactory.addAdvice(new ZsjAfterAdvice());proxyFactory.addAdvice(new ZsjThrowAdvice());UserInterface userService = (UserInterface) proxyFactory.getProxy();userService.a();}
public class ZsjThrowAdvice implements ThrowsAdvice {public void afterThrowing(Method method, Object[] objects, Object target,NullPointerException e){System.out.println("方法抛出异常后执行");}}

执行结果:

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

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

相关文章

智能穿戴AR眼镜主板方案定制_MTK平台AR智能眼镜PCB板开发

AR智能眼镜,是采用了多种技术实现增强现实效果,是将虚拟信息和现实场景相结合的智能设备。 AR智能眼镜硬件上,包括多个传感器、显示装置和处理器等。其中,传感器用于捕捉用户的动作和环境信息,如摄像头、陀螺仪、加速…

【Python】 Python 使用 Pillow 处理图像:几何变换

Python 使用 Pillow 处理图像:几何变换 pillow库操作切片、旋转、滤镜、输出文字、调色板等功能一应俱全。 1. 几何变换 Image 包含调整图像大小 resize() 和旋转 rotate() 的方法。前者采用元组给出新的大小,后者采用逆时针方向的角度。 调整大小并…

将VS工程转为Qt的pro工程及VS安装Qt插件后没有create basic .pro file菜单问题解决

目录 1. 前言 2. VS工程转为pro工程 3. 没有create basic .pro file菜单 1. 前言 很多小伙伴包括本人,如果是在Windows下开发Qt程序,偏好用Visual Studio外加装个Qt插件进行Qt开发,毕竟Visual Studio确实是功能强大的IDE,但有时…

SpringCloud微服务:Ribbon负载均衡

目录 负载均衡策略: 负载均衡的两种方式: 饥饿加载 1. Ribbon负载均衡规则 规则接口是IRule 默认实现是ZoneAvoidanceRule,根据zone选择服务列表,然后轮询 2.负载均衡自定义方式 代码方式:配置灵活,但修…

Linux--makefile

一、makefile的作用 makefile是一个文件,是围绕依赖关系和依赖方法的自动化编译工具 一个工程中的源文件有很多,按照不同的类型、功能、模块放在不同的目录中。而makefile定义了一系列的规则来指定,那些文件需要先编译,那些文件…

【算法与数据结构】93、LeetCode复原 IP 地址

文章目录 一、题目二、解法三、完整代码 所有的LeetCode题解索引,可以看这篇文章——【算法和数据结构】LeetCode题解。 一、题目 二、解法 思路分析:参照【算法与数据结构】131、LeetCode分割回文串的思路,需要将IP字符串进行分割&#xff0…

JVM虚拟机:垃圾回收之三色标记

本文重点 在前面的课程中我们已经学习了垃圾回收器CMS和G1,其中CMS和G1中的mixedGC都存在四个过程,这四个过程中有一个过程叫做并发标记,也就是说程序一边运行,一边标记垃圾。这个过程最困难的是:如果在标记垃圾的时候,如果对象的引用关系发生了改变,此时应该如何处理?…

【分布式】CAP理论详解

一、CAP理论概述 在分布式系统中,CAP是指一组原则,它们描述了在网络分区(Partition)时,分布式系统能够提供的保证。CAP代表Consistency(一致性)、Availability(可用性)和…

【Python】上市公司数据进行经典OLS回归实操

一、题目二、数据合并、清洗、描述性统计1、数据获取2、数据合并3、选择董监高薪酬作为解释变量的理论逻辑分析 三、多元回归模型的参数估计、结果展示与分析1、描述性统计分析2、剔除金融类上市公司3、对所有变量进行1%缩尾处理4、0-1标准化,所有解释变量5、绘制热…

让公有云服务“宁安如梦”的“定心丸”在哪里?

电视剧《宁安如梦》正在热播中,该剧讲述了主人公在经历人生的重大风险后,重获新生再活一遍,以确定性的方式抵御和化解原有的重大风险。然而,在现实的生活中,却没有这样的重来机会。 2023年11月13日,Gartne…

AI歌姬,C位出道,基于PaddleHub/Diffsinger实现音频歌声合成操作(Python3.10)

懂乐理的音乐专业人士可以通过写乐谱并通过乐器演奏来展示他们的音乐创意和构思,但不识谱的素人如果也想跨界玩儿音乐,那么门槛儿就有点高了。但随着人工智能技术的快速迭代,现在任何一个人都可以成为“创作型歌手”,即自主创作并…

2024上海国际智能驾驶技术展览会(自动驾驶展)

2024上海国际智能驾驶技术展览会 2024 Shanghai International Autonomous driving Expo 时间:2024年3月26-28日 地点:上海跨国采购会展中心 随着科技的飞速发展,智能驾驶已经成为了汽车行业的重要趋势。在这个时代背景下,汽车不…