日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

面試官:拋開Spring來說,如何自己實現Spring AOP?

來源: 責編: 時間:2023-11-28 09:36:12 247觀看
導讀哈嘍,大家好,我是了不起。作為一名Java程序員,面向切面編程這種編程思想,應該是我們日常編碼中常應用的編程思想。這種編程范式,旨在提高代碼的模塊化程度。在AOP中,特定類型的問題被定義為“切面”,例如日志、事務管理或安

哈嘍,大家好,我是了不起。uEL28資訊網——每日最新資訊28at.com

作為一名Java程序員,面向切面編程這種編程思想,應該是我們日常編碼中常應用的編程思想。uEL28資訊網——每日最新資訊28at.com

這種編程范式,旨在提高代碼的模塊化程度。在AOP中,特定類型的問題被定義為“切面”,例如日志、事務管理或安全性等,這些切面可以在不改變核心業務邏輯的情況下,被插入程序的不同部分。對于提高代碼的優雅,減少冗余度特別有用。uEL28資訊網——每日最新資訊28at.com

雖然Spring框架中的Spring AOP是Java社區中最著名的AOP實現,但為了完全理解這種思想,我們可以不依賴Spring來實現AOP功能。uEL28資訊網——每日最新資訊28at.com

1、AOP 核心概念

1.1 切面(Aspects)

切面是AOP的核心,它將橫切關注點(如日志、事務處理等)與主業務邏輯分離。一個切面定義了何時(何處)和如何執行這些橫切關注點。uEL28資訊網——每日最新資訊28at.com

1.2 連接點(Join Points)

連接點是應用執行過程中能夠插入切面的點。在Java中,這通常是方法的調用。uEL28資訊網——每日最新資訊28at.com

1.3 通知(Advice)

通知定義了切面具體要執行的操作。主要類型包括前置通知(before)、后置通知(after)、環繞通知(around)、拋出異常時通知(after throwing)和返回時通知(after returning)。uEL28資訊網——每日最新資訊28at.com

1.4 切點(Pointcuts)

切點定義了在哪些連接點執行切面代碼。它是一組表達式,用于匹配特定的連接點。uEL28資訊網——每日最新資訊28at.com

2、使用Java動態代理

Java動態代理是一種在運行時創建代理對象的方法,代理對象可以在調用實際對象的方法前后執行額外的操作。uEL28資訊網——每日最新資訊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接口中的操作。uEL28資訊網——每日最新資訊28at.com

3、字節碼操作

字節碼操作是更高級但復雜的AOP實現方式。這涉及在類加載到JVM時修改其字節碼,插入額外的代碼。uEL28資訊網——每日最新資訊28at.com

3.1 使用ASM或ByteBuddy

  • ASM:一種低級字節碼操作庫,提供了對字節碼的細粒度控制。
  • ByteBuddy:相比ASM,ByteBuddy提供了更簡潔的API,適合那些不需要深入字節碼細節的場景。

下面我以 ByteBuddy 為例,展示一下如何使用ByteBuddy來實現一個基本的AOP功能:在方法執行前后添加日志。uEL28資訊網——每日最新資訊28at.com

①、添加ByteBuddy依賴到你的項目中。如果你使用Maven,可以在pom.xml文件中加入以下依賴:uEL28資訊網——每日最新資訊28at.com

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

②、使用ByteBuddy來創建一個代理類,這個類在方法執行前后打印日志:uEL28資訊網——每日最新資訊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類中,我們在方法執行前后添加了日志。uEL28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34648-0.html面試官:拋開Spring來說,如何自己實現Spring AOP?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 如何使用 Formik 創建 React 表單

下一篇: 為什么你應該把 Google / StackOverflow / 文檔搜索都扔掉,改用 devv.ai?

標簽:
  • 熱門焦點
  • SpringBoot中使用Cache提升接口性能詳解

    環境:springboot2.3.12.RELEASE + JSR107 + Ehcache + JPASpring 框架從 3.1 開始,對 Spring 應用程序提供了透明式添加緩存的支持。和事務支持一樣,抽象緩存允許一致地使用各
  • 如何正確使用:Has和:Nth-Last-Child

    我們可以用CSS檢查,以了解一組元素的數量是否小于或等于一個數字。例如,一個擁有三個或更多子項的grid。你可能會想,為什么需要這樣做呢?在某些情況下,一個組件或一個布局可能會
  • 多線程開發帶來的問題與解決方法

    使用多線程主要會帶來以下幾個問題:(一)線程安全問題  線程安全問題指的是在某一線程從開始訪問到結束訪問某一數據期間,該數據被其他的線程所修改,那么對于當前線程而言,該線程
  • 使用Webdriver-manager解決瀏覽器與驅動不匹配所帶來自動化無法執行的問題

    1、前言在我們使用 Selenium 進行 UI 自動化測試時,常常會因為瀏覽器驅動與瀏覽器版本不匹配,而導致自動化測試無法執行,需要手動去下載對應的驅動版本,并替換原有的驅動,可能還
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運營研究社作者 | 張知白編輯 | 楊佩汶設計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了&mdash;&mdash;貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 騰訊蓋樓,字節拆墻

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之&ldquo;想重溫暴刷深淵、30+技能搭配暴搓到爽的游戲體驗嗎?一起上晶核,即刻暴打!&rdquo;曾憑借直播騰訊旗下代理格斗游戲《DNF》一
  • 華為Mate60標準版細節曝光:經典星環相機模組回歸

    這段時間以來,關于華為新旗艦的爆料日漸密集。據此前多方爆料,今年華為將開始恢復一年雙旗艦戰略,除上半年推出的P60系列外,往年下半年的Mate系列也將
  • 超閉合精工鉸鏈 徹底消滅縫隙 三星Galaxy Z Flip5與Galaxy Z Fold5發布

    2023年7月26日,三星電子正式發布了Galaxy Z Flip5與Galaxy Z Fold5。三星新一代折疊屏手機采用超閉合精工鉸鏈,讓折疊后的縫隙不再可見。同時,配合處
  • 英特爾Xe-HP項目終止,將專注Xe-HPC/HPG系列顯卡

    據10 月 31 日消息報道,英特爾高級副總裁兼加速計算系統和圖形事業部總經理 表示,Xe-HP“ Arctic Sound” 系列服務器 GPU 已經應用于 oneAPI devcloud 云服
Top 主站蜘蛛池模板: 延川县| 梁河县| 探索| 商洛市| 道真| 盘山县| 松阳县| 克什克腾旗| 宝鸡市| 泗水县| 即墨市| 佛教| 陆丰市| 高淳县| 彭山县| 静宁县| 太康县| 柯坪县| 盐亭县| 耿马| 龙泉市| 祥云县| 花莲县| 庄河市| 浮梁县| 霍邱县| 郓城县| 四会市| 吉隆县| 元谋县| 罗城| 岑巩县| 台南市| 迭部县| 永德县| 中方县| 日喀则市| 龙岩市| 扶绥县| 昂仁县| 汽车|