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

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

如何使用 CGLIB 在 Spring Boot 3.3 中實現動態代理

來源: 責編: 時間:2024-09-10 09:50:59 196觀看
導讀在 Java 開發中,代理模式是一種重要的設計模式,通過代理對象來控制對目標對象的訪問。代理模式在 AOP(面向切面編程)中得到了廣泛應用,尤其是在 Spring 框架中。Spring 提供了兩種主要的代理機制:JDK 動態代理和 CGLIB 動態

在 Java 開發中,代理模式是一種重要的設計模式,通過代理對象來控制對目標對象的訪問。代理模式在 AOP(面向切面編程)中得到了廣泛應用,尤其是在 Spring 框架中。Spring 提供了兩種主要的代理機制:JDK 動態代理和 CGLIB 動態代理。其中,JDK 動態代理僅能代理實現了接口的類,而 CGLIB 動態代理則沒有這一限制,可以代理任何普通的類。因此,CGLIB 動態代理在實際開發中非常實用,特別是在需要代理沒有實現接口的類時。tFU28資訊網——每日最新資訊28at.com

本文將深入探討如何在 Spring Boot 3.3 中使用 CGLIB 實現動態代理。我們將通過具體的代碼示例,展示如何在應用程序中集成 CGLIB,并解釋其在 AOP 編程中的應用場景和優勢。同時,我們還將展示如何通過前后端協作,將代理后的效果展示在 Web 頁面上,從而幫助開發者更好地理解和運用 CGLIB 動態代理。tFU28資訊網——每日最新資訊28at.com

CGLIB 簡介

CGLIB(Code Generation Library)是一個強大的高性能代碼生成庫,主要用于在運行時動態生成類和代理對象。CGLIB 通過使用底層的 ASM 字節碼操縱框架,直接操作字節碼文件,生成新的類或增強現有的類。與 JDK 動態代理不同,CGLIB 不需要目標類實現任何接口,這使得它在處理代理普通類時顯得非常靈活和強大。tFU28資訊網——每日最新資訊28at.com

CGLIB 動態代理的工作原理是通過生成目標類的子類,并在子類中重寫目標類的方法來實現對方法調用的攔截。CGLIB 可以在方法調用的前后添加自定義邏輯,例如日志記錄、性能監控、事務管理等。這使得它在實現 AOP 編程時具有極大的優勢,尤其是在 Spring 框架中被廣泛應用。tFU28資訊網——每日最新資訊28at.com

值得注意的是,由于 CGLIB 是通過繼承的方式實現代理,因此目標類不能是 final 的,否則會導致代理失敗。此外,目標類中的 final 方法也無法被代理,因為 final 方法不能被重寫。tFU28資訊網——每日最新資訊28at.com

運行效果:tFU28資訊網——每日最新資訊28at.com

圖片圖片tFU28資訊網——每日最新資訊28at.com

若想獲取項目完整代碼以及其他文章的項目源碼,且在代碼編寫時遇到問題需要咨詢交流,歡迎加入下方的知識星球。tFU28資訊網——每日最新資訊28at.com

項目結構

在開始之前,我們需要設置一個 Spring Boot 3.3 項目。項目結構如下:tFU28資訊網——每日最新資訊28at.com

cglib-demo├── src│   ├── main│   │   ├── java│   │   │   └── com│   │   │       └── icoderoad│   │   │           └── cglib│   │   │               ├── service│   │   │               │   └── CglibDemoService.java│   │   │               ├── proxy│   │   │               │   └── CglibProxy.java│   │   │               └── CglibDemoApplication.java│   │   └── resources│   │       ├── application.yaml│   │       └── templates│   │           └── index.html└── pom.xml

配置文件

pom.xml 配置

首先,在 pom.xml 文件中引入必要的依賴:tFU28資訊網——每日最新資訊28at.com

<?xml versinotallow="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">	<modelVersion>4.0.0</modelVersion>	<parent>		<groupId>org.springframework.boot</groupId>		<artifactId>spring-boot-starter-parent</artifactId>		<version>3.3.3</version>		<relativePath/> <!-- lookup parent from repository -->	</parent>	<groupId>com.icoderoad</groupId>	<artifactId>cglib-demo</artifactId>	<version>0.0.1-SNAPSHOT</version>	<name>cglib-demo</name>	<description>Demo project for Spring Boot</description>		<properties>		<java.version>17</java.version>	</properties>	<dependencies>		<!-- Spring Boot Starter Web -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-web</artifactId>        </dependency>        <!-- Spring Boot Thymeleaf -->        <dependency>            <groupId>org.springframework.boot</groupId>            <artifactId>spring-boot-starter-thymeleaf</artifactId>        </dependency>        <!-- CGLIB Dependency -->        <dependency>		    <groupId>cglib</groupId>		    <artifactId>cglib-nodep</artifactId>		    <version>3.3.0</version> <!-- 或者更高的版本 -->		</dependency>        <!-- Bootstrap CSS -->        <dependency>            <groupId>org.webjars</groupId>            <artifactId>bootstrap</artifactId>            <version>5.3.0</version>        </dependency>		<dependency>			<groupId>org.springframework.boot</groupId>			<artifactId>spring-boot-starter-test</artifactId>			<scope>test</scope>		</dependency>	</dependencies>	<build>		<plugins>			<plugin>				<groupId>org.springframework.boot</groupId>				<artifactId>spring-boot-maven-plugin</artifactId>			</plugin>		</plugins>	</build></project>
application.yaml 配置

在 src/main/resources/application.yaml 文件中,我們可以加入一些簡單的配置:tFU28資訊網——每日最新資訊28at.com

server:  port: 8080spring:  thymeleaf:    cache: false

CGLIB 動態代理實現

創建一個簡單的服務類

首先,我們創建一個服務類 CglibDemoService,這個類將被代理:tFU28資訊網——每日最新資訊28at.com

package com.icoderoad.cglib_demo.service;public class CglibDemoService {    public String sayHello(String name) {        return "你好, " + name;    }    public String sayGoodbye(String name) {        return "再見, " + name;    }}
創建 CGLIB 代理類

接下來,我們創建一個 CGLIB 代理類 CglibProxy,用于攔截方法調用并進行處理:tFU28資訊網——每日最新資訊28at.com

package com.icoderoad.cglib_demo.proxy;import java.lang.reflect.Method;import net.sf.cglib.proxy.Enhancer;import net.sf.cglib.proxy.MethodInterceptor;import net.sf.cglib.proxy.MethodProxy;public class CglibProxy implements MethodInterceptor {    // 被代理的目標對象    private final Object target;    // 構造方法,傳入目標對象    public CglibProxy(Object target) {        this.target = target;    }    // 攔截方法,在目標方法執行前后加入自定義邏輯    @Override    public Object intercept(Object obj, Method method, Object[] args, MethodProxy proxy) throws Throwable {        System.out.println("方法執行前: " + method.getName());        Object result = proxy.invoke(target, args);        System.out.println("方法執行后: " + method.getName());        return result;    }    // 獲取代理對象    public Object getProxy() {        Enhancer enhancer = new Enhancer();        enhancer.setSuperclass(target.getClass());        enhancer.setCallback(this);        return enhancer.create();    }}
使用代理類

在應用的啟動類中,我們將使用 CglibProxy 來代理 CglibDemoService:tFU28資訊網——每日最新資訊28at.com

package com.icoderoad.cglib_demo;import org.springframework.boot.CommandLineRunner;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;import com.icoderoad.cglib_demo.proxy.CglibProxy;import com.icoderoad.cglib_demo.service.CglibDemoService;@SpringBootApplicationpublic class CglibDemoApplication implements CommandLineRunner {	public static void main(String[] args) {        SpringApplication.run(CglibDemoApplication.class, args);    }    @Override    public void run(String... args) throws Exception {        CglibDemoService targetService = new CglibDemoService();        CglibProxy proxy = new CglibProxy(targetService);        CglibDemoService proxyService = (CglibDemoService) proxy.getProxy();                // 調用代理對象的方法        System.out.println(proxyService.sayHello("小明"));        System.out.println(proxyService.sayGoodbye("小明"));    }}

在這個例子中,我們通過 CglibProxy 代理 CglibDemoService,并在方法調用前后添加了自定義邏輯。tFU28資訊網——每日最新資訊28at.com

后端控制器

為了將數據傳遞到前端頁面,我們需要創建一個控制器:tFU28資訊網——每日最新資訊28at.com

package com.icoderoad.cglib_demo.controller;import org.springframework.stereotype.Controller;import org.springframework.ui.Model;import org.springframework.web.bind.annotation.GetMapping;import com.icoderoad.cglib_demo.proxy.CglibProxy;import com.icoderoad.cglib_demo.service.CglibDemoService;@Controllerpublic class DemoController {    @GetMapping("/")    public String index(Model model) {        // 創建目標對象        CglibDemoService demoService = new CglibDemoService();        // 創建代理對象        CglibProxy proxy = new CglibProxy(demoService);        CglibDemoService proxyService = (CglibDemoService) proxy.getProxy();        // 將方法調用結果傳遞給前端頁面        model.addAttribute("helloMessage", proxyService.sayHello("路條編程"));        model.addAttribute("goodbyeMessage", proxyService.sayGoodbye("路條編程"));        return "index";    }}

前端頁面展示

Thymeleaf 模板

在 src/main/resources/templates/index.html 文件中,創建一個簡單的前端頁面:tFU28資訊網——每日最新資訊28at.com

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head>    <meta charset="UTF-8">    <title>CGLIB 代理演示</title>    <link rel="stylesheet" th:href="@{/webjars/bootstrap/5.3.0/css/bootstrap.min.css}"></head><body><div class="container">    <h1>CGLIB 代理演示</h1>    <p th:text="'歡迎消息: ' + ${helloMessage}"></p>    <p th:text="'告別消息: ' + ${goodbyeMessage}"></p></div><script th:src="@{/webjars/bootstrap/5.3.0/js/bootstrap.bundle.min.js}"></script></body></html>

使用 --add-opens JVM 參數

在啟動你的應用時,添加 --add-opens 參數以允許訪問被封閉的模塊:tFU28資訊網——每日最新資訊28at.com

java --add-opens java.base/java.lang=ALL-UNNAMED -jar your-application.jar

如果你是在 IDE 中運行應用程序,可以在 IDE 的運行配置中添加這個參數。tFU28資訊網——每日最新資訊28at.com

在 Eclipse 中配置 JVM 參數來解決 CGLIB 與 Java 模塊系統兼容性問題,可以按照以下步驟操作:tFU28資訊網——每日最新資訊28at.com

配置 JVM 參數

  1. 打開 Eclipse 項目屬性
  • 在 Eclipse 中,右鍵點擊你的項目,選擇 Properties(屬性)。
  1. 進入 Run/Debug Settings
  • 在左側面板中,選擇 Run/Debug Settings。tFU28資訊網——每日最新資訊28at.com

  1. 選擇或創建運行配置tFU28資訊網——每日最新資訊28at.com

  • 如果已有運行配置,選擇你要修改的配置,然后點擊 Edit(編輯)。tFU28資訊網——每日最新資訊28at.com

  • 如果沒有,點擊 New Configuration(新建配置),然后選擇 Java Application 或 Spring Boot App,點擊 New(新建)。tFU28資訊網——每日最新資訊28at.com

  1. 配置 VM ArgumentstFU28資訊網——每日最新資訊28at.com

  • 在 Arguments 標簽頁中,找到 VM arguments 輸入框。在這里你可以添加 JVM 啟動參數。tFU28資訊網——每日最新資訊28at.com

  • 在 VM arguments 輸入框中,添加如下參數:tFU28資訊網——每日最新資訊28at.com

    --add-opens java.base/java.lang=ALL-UNNAMED
  • 這個參數允許你訪問 Java 內部 API,解決 CGLIB 在模塊系統中的兼容性問題。tFU28資訊網——每日最新資訊28at.com

  1. 保存配置tFU28資訊網——每日最新資訊28at.com

  • 點擊 Apply(應用),然后點擊 Run(運行)以保存并應用你的配置。tFU28資訊網——每日最新資訊28at.com

運行效果

啟動 Spring Boot 項目后,訪問 http://localhost:8080,頁面上將顯示通過 CGLIB 動態代理處理后的消息,控制臺中可以看到方法執行前后的日志輸出。tFU28資訊網——每日最新資訊28at.com

總結

本文詳細介紹了如何在 Spring Boot 3.3 中使用 CGLIB 實現動態代理。通過實際的代碼示例,展示了 CGLIB 在動態代理中的應用,以及如何在 Spring Boot 項目中集成 CGLIB。我們還演示了如何通過 Thymeleaf 和 Bootstrap 實現一個簡單的前端頁面,以展示代理后的效果。希望通過這篇文章,您能對 CGLIB 動態代理有一個更深入的理解。tFU28資訊網——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-112781-0.html如何使用 CGLIB 在 Spring Boot 3.3 中實現動態代理

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

上一篇: 超贊!Spring Boot 3.3 自帶 Controller 接口監控,大家趕緊用起來

下一篇: Java8 中一個極其強悍的新接口,很多人沒用過

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
亚洲伊人网站| 亚洲国产精品免费| 欧美性大战xxxxx久久久| 国产精品久久久久久av福利软件 | 亚洲影院色无极综合| 欧美在线欧美在线| 欧美国产精品久久| 国产精品美女久久久免费| 国内精品久久久久久久果冻传媒 | 99精品免费| 欧美在线观看你懂的| 亚洲综合日韩在线| 久久精品卡一| 欧美日韩国产综合视频在线观看中文 | 久久一区二区三区av| 欧美久久视频| 国产私拍一区| 9人人澡人人爽人人精品| 久久aⅴ国产欧美74aaa| 欧美日韩福利视频| 韩国v欧美v日本v亚洲v | 欧美暴力喷水在线| 国产精品视频第一区| 亚洲国产精品尤物yw在线观看| 亚洲一区二区三区涩| 蜜臀99久久精品久久久久久软件| 欧美视频不卡中文| 在线日本成人| 午夜精品久久久久| 欧美日韩ab| 亚洲第一天堂无码专区| 亚洲欧美国产精品va在线观看| 欧美不卡视频一区发布| 国产一区二区黄| 在线一区日本视频| 欧美jizz19性欧美| 国产在线拍揄自揄视频不卡99| 一区二区三区精密机械公司| 久久综合给合久久狠狠色| 国产欧美一区二区三区久久人妖 | 亚洲国产一区二区三区高清| 欧美主播一区二区三区| 欧美午夜欧美| 亚洲精品少妇30p| 久久婷婷麻豆| 国产日韩欧美一区二区三区在线观看 | 亚洲欧美精品在线观看| 欧美日韩国产在线| 亚洲国产精品久久久久秋霞影院| 欧美伊人久久久久久久久影院| 欧美视频中文在线看 | 亚洲精品视频一区| 久久久噜噜噜久久久| 一区二区三区精品国产| 麻豆91精品| 黄色日韩网站视频| 久久精品国产久精国产一老狼| 国产精品九九| 亚洲图片欧洲图片av| 欧美日韩爆操| 亚洲精品一区在线观看香蕉| 免费久久99精品国产自在现线| 国内精品久久久久久久影视麻豆 | 久久躁狠狠躁夜夜爽| 狠狠色丁香婷婷综合久久片| 欧美一区二区视频在线观看2020| 国产精品久久久久高潮| 中文一区在线| 欧美涩涩网站| 亚洲午夜国产一区99re久久| 欧美日韩精品二区| 亚洲欧洲日产国产综合网| 免费成人小视频| 亚洲高清在线| 欧美不卡福利| 91久久亚洲| 欧美区一区二| aa国产精品| 国产精品yjizz| 亚洲一区免费| 国产精品一区二区久激情瑜伽| 亚洲永久精品国产| 国产精品视频免费| 欧美在线在线| 激情婷婷欧美| 免费看亚洲片| 一本久道综合久久精品| 国产精品成人午夜| 午夜精品久久久| 国产婷婷97碰碰久久人人蜜臀| 欧美在线播放| 国产一区二区三区av电影| 久久久激情视频| 精品不卡一区| 欧美激情视频网站| 亚洲天堂免费在线观看视频| 国产精品视频一区二区高潮| 小嫩嫩精品导航| 国产综合亚洲精品一区二| 久久伊伊香蕉| 亚洲精品人人| 国产精品初高中精品久久| 亚洲欧美在线x视频| 韩国精品久久久999| 欧美成人亚洲成人| 一区二区三区欧美在线| 国产精品日韩欧美一区二区| 久久精品在线视频| 亚洲精品一品区二品区三品区| 欧美日韩一二三区| 欧美一区二区在线观看| 伊人久久亚洲美女图片| 欧美精品在欧美一区二区少妇| 亚洲天堂av图片| 国产视频一区二区三区在线观看| 免费精品99久久国产综合精品| av成人天堂| 国产日韩精品入口| 欧美a级片网站| 亚洲午夜小视频| 伊人成人网在线看| 欧美日韩精品三区| 久久久精品久久久久| 99精品久久久| 国产一区二区三区久久久久久久久| 男女激情视频一区| 亚洲欧美中文日韩v在线观看| 一区视频在线播放| 欧美性猛交一区二区三区精品| 久久激五月天综合精品| 亚洲另类春色国产| 国产亚洲精品资源在线26u| 欧美国产综合一区二区| 亚洲在线国产日韩欧美| 精品动漫3d一区二区三区免费版 | 亚洲国产精品成人va在线观看| 国产精品盗摄一区二区三区| 久久久噜噜噜久噜久久| 在线亚洲电影| 尤物yw午夜国产精品视频明星| 欧美日韩一区二区三区视频| 久久精品99无色码中文字幕 | 亚洲天堂成人在线观看| 在线视频成人| 国产精品视频久久一区| 欧美成人精品一区二区三区| 翔田千里一区二区| 99在线热播精品免费99热| 在线观看亚洲| 国产欧美精品在线播放| 欧美日韩国产影片| 免费在线观看日韩欧美| 欧美一级淫片播放口| a4yy欧美一区二区三区| 亚洲动漫精品| 国产欧美一区二区在线观看| 欧美日韩国产二区| 免费成人在线视频网站| 欧美尤物巨大精品爽| 亚洲伊人观看| 99视频精品全国免费| 亚洲激情视频在线| 精品动漫3d一区二区三区| 国产欧美一区二区三区在线看蜜臀 | 伊人成人开心激情综合网| 亚洲综合社区| 亚洲国产视频直播| 国产日韩一区二区三区在线| 欧美日精品一区视频| 欧美高清视频www夜色资源网| 久久久国产一区二区| 亚洲欧美日韩综合aⅴ视频| 99在线精品观看| 亚洲国产一区二区精品专区| 韩国福利一区| 国产视频亚洲精品| 国产欧美日韩不卡免费| 欧美视频观看一区| 欧美日韩国产一区| 欧美激情综合五月色丁香| 蜜桃伊人久久| 免费人成精品欧美精品| 久久久人成影片一区二区三区观看| 亚洲一区二区伦理| 亚洲最新在线视频| 日韩亚洲视频在线| 亚洲免费观看| 亚洲精品久久久蜜桃| 亚洲人成高清| 亚洲精品一区二| 日韩一本二本av| 亚洲看片一区| 亚洲精选视频免费看| 亚洲人久久久| 亚洲欧洲在线视频| 亚洲精品欧洲| 日韩视频一区二区三区在线播放免费观看 | 裸体一区二区三区| 麻豆精品一区二区综合av| 久久亚洲风情| 欧美 日韩 国产精品免费观看| 久久综合久久综合九色| 久久网站热最新地址| 欧美成人激情在线|