当前位置:首页 > 科技  > 软件

面试官:抛开Spring来说,如何自己实现Spring AOP?

来源: 责编: 时间:2023-11-28 09:36:12 321观看
导读哈喽,大家好,我是了不起。作为一名Java程序员,面向切面编程这种编程思想,应该是我们日常编码中常应用的编程思想。这种编程范式,旨在提高代码的模块化程度。在AOP中,特定类型的问题被定义为“切面”,例如日志、事务管理或安

哈喽,大家好,我是了不起。Zca28资讯网——每日最新资讯28at.com

作为一名Java程序员,面向切面编程这种编程思想,应该是我们日常编码中常应用的编程思想。Zca28资讯网——每日最新资讯28at.com

这种编程范式,旨在提高代码的模块化程度。在AOP中,特定类型的问题被定义为“切面”,例如日志、事务管理或安全性等,这些切面可以在不改变核心业务逻辑的情况下,被插入程序的不同部分。对于提高代码的优雅,减少冗余度特别有用。Zca28资讯网——每日最新资讯28at.com

虽然Spring框架中的Spring AOP是Java社区中最著名的AOP实现,但为了完全理解这种思想,我们可以不依赖Spring来实现AOP功能。Zca28资讯网——每日最新资讯28at.com

1、AOP 核心概念

1.1 切面(Aspects)

切面是AOP的核心,它将横切关注点(如日志、事务处理等)与主业务逻辑分离。一个切面定义了何时(何处)和如何执行这些横切关注点。Zca28资讯网——每日最新资讯28at.com

1.2 连接点(Join Points)

连接点是应用执行过程中能够插入切面的点。在Java中,这通常是方法的调用。Zca28资讯网——每日最新资讯28at.com

1.3 通知(Advice)

通知定义了切面具体要执行的操作。主要类型包括前置通知(before)、后置通知(after)、环绕通知(around)、抛出异常时通知(after throwing)和返回时通知(after returning)。Zca28资讯网——每日最新资讯28at.com

1.4 切点(Pointcuts)

切点定义了在哪些连接点执行切面代码。它是一组表达式,用于匹配特定的连接点。Zca28资讯网——每日最新资讯28at.com

2、使用Java动态代理

Java动态代理是一种在运行时创建代理对象的方法,代理对象可以在调用实际对象的方法前后执行额外的操作。Zca28资讯网——每日最新资讯28at.com

import java.lang.reflect.InvocationHandler;import java.lang.reflect.Method;import java.lang.reflect.Proxy;// 简单的AOP实现public class SimpleAOP {    // 获取代理对象    public static Object getProxy(Object target, Advice advice) {        return Proxy.newProxyInstance(            target.getClass().getClassLoader(),            target.getClass().getInterfaces(),            new InvocationHandler() {                @Override                public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {                    advice.beforeMethod(method);                    Object result = method.invoke(target, args);                    advice.afterMethod(method);                    return result;                }            }        );    }    // 通知接口    public interface Advice {        void beforeMethod(Method method);        void afterMethod(Method method);    }}

在上述代码中,getProxy 方法创建了一个代理对象,该对象在每次方法调用前后执行定义在 Advice接口中的操作。Zca28资讯网——每日最新资讯28at.com

3、字节码操作

字节码操作是更高级但复杂的AOP实现方式。这涉及在类加载到JVM时修改其字节码,插入额外的代码。Zca28资讯网——每日最新资讯28at.com

3.1 使用ASM或ByteBuddy

  • ASM:一种低级字节码操作库,提供了对字节码的细粒度控制。
  • ByteBuddy:相比ASM,ByteBuddy提供了更简洁的API,适合那些不需要深入字节码细节的场景。

下面我以 ByteBuddy 为例,展示一下如何使用ByteBuddy来实现一个基本的AOP功能:在方法执行前后添加日志。Zca28资讯网——每日最新资讯28at.com

①、添加ByteBuddy依赖到你的项目中。如果你使用Maven,可以在pom.xml文件中加入以下依赖:Zca28资讯网——每日最新资讯28at.com

<dependency>    <groupId>net.bytebuddy</groupId>    <artifactId>byte-buddy</artifactId>    <version>1.11.22</version></dependency>

②、使用ByteBuddy来创建一个代理类,这个类在方法执行前后打印日志:Zca28资讯网——每日最新资讯28at.com

import net.bytebuddy.ByteBuddy;import net.bytebuddy.implementation.FixedValue;import net.bytebuddy.matcher.ElementMatchers;import net.bytebuddy.implementation.MethodDelegation;import net.bytebuddy.dynamic.DynamicType;import net.bytebuddy.dynamic.loading.ClassLoadingStrategy;import java.lang.reflect.Modifier;public class AOPExample {    public static void main(String[] args) throws Exception {        DynamicType.Unloaded<Object> dynamicType = new ByteBuddy()            .subclass(Object.class)            .method(ElementMatchers.named("toString"))            .intercept(MethodDelegation.to(LoggerInterceptor.class))            .make();        Class<?> dynamicTypeLoaded = dynamicType            .load(AOPExample.class.getClassLoader(), ClassLoadingStrategy.Default.WRAPPER)            .getLoaded();        Object dynamicObject = dynamicTypeLoaded.newInstance();        System.out.println(dynamicObject.toString());    }    public static class LoggerInterceptor {        public static String intercept() {            System.out.println("Method intercepted before execution");            String result = "Hello from intercepted method";            System.out.println("Method intercepted after execution");            return result;        }    }}

在上述代码中,我们创建了一个代理类,它覆盖了toString方法。方法被调用时,我们的LoggerInterceptor类将被调用。在LoggerInterceptor类中,我们在方法执行前后添加了日志。Zca28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-34648-0.html面试官:抛开Spring来说,如何自己实现Spring AOP?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何使用 Formik 创建 React 表单

下一篇: 为什么你应该把 Google / StackOverflow / 文档搜索都扔掉,改用 devv.ai?

标签:
  • 热门焦点
  • 6月安卓手机性价比榜:Note 12 Turbo断层式碾压

    6月份有一个618,虽然这是京东周年庆的日子,但别的电商也都不约而同的跟进了,反正促销没坏处,厂商和用户都能满意。618期间一些产品也出现了历史低价,那么各个价位段的产品性价比
  • 线程通讯的三种方法!通俗易懂

    线程通信是指多个线程之间通过某种机制进行协调和交互,例如,线程等待和通知机制就是线程通讯的主要手段之一。 在 Java 中,线程等待和通知的实现手段有以下几种方式:Object 类下
  • Rust中的高吞吐量流处理

    作者 | Noz编译 | 王瑞平本篇文章主要介绍了Rust中流处理的概念、方法和优化。作者不仅介绍了流处理的基本概念以及Rust中常用的流处理库,还使用这些库实现了一个流处理程序
  • 19个 JavaScript 单行代码技巧,让你看起来像个专业人士

    今天这篇文章跟大家分享18个JS单行代码,你只需花几分钟时间,即可帮助您了解一些您可能不知道的 JS 知识,如果您已经知道了,就当作复习一下,古人云,温故而知新嘛。现在,我们就开始今
  • “又被陈思诚骗了”

    作者|张思齐 出品|众面(ID:ZhongMian_ZM)如今的国产悬疑电影,成了陈思诚的天下。最近大爆电影《消失的她》票房突破30亿断层夺魁暑期档,陈思诚再度风头无两。你可以说陈思诚的
  • 花7万退货退款无门:谁在纵容淘宝珠宝商家造假?

    来源:极点商业作者:杨铭在淘宝购买珠宝玉石后,因为保证金不够赔付,店铺关闭,退货退款难、维权无门的比比皆是。&ldquo;提供相关产品鉴定证书,支持全国复检,可以30天无理由退换货。&
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • 小米汽车电池信息疑似曝光:容量101kWh,支持800V高压快充

    7月14日消息,今日一名博主在社交媒体发布了一张疑似小米汽车电池信息的照片,显示该电池包正是宁德时代麒麟电池,容量为101kWh,电压为726.7V,可以预测小
  • 最薄的14英寸游戏笔记本电脑 Alienware X14已可以购买

    2022年1月份在国际消费电子展(CES2022)上首次亮相的Alienware新品——Alienware X14现在已经可以购买了,这款笔记本电脑被誉为世界上最薄的 14 英寸游戏笔
Top