Spring之AOP入門

1.AOP介紹

AOP(Aspect Oriented Programming)面向切面編程,一種編程范式,指導開發者如何組織程序結構,作用是在不改動原始設計的基礎上為其進行功能增強

2.AOP的核心概念

概念定義SpringAOP(注解開發)中的具體形式
連接點(JoinPoint)程序執行過程中的任意位置,粒度為執行方法、拋出異常、設置變量等執行方法
切入點(PointCut)匹配連接點的式子一個切入點可以只描述一個方法,也可以匹配多個方法
通知(Advice)在切入點處執行的操作,也就是共性功能以方法的形式呈現
切面(Aspect)描述通知與切入點的對應關系@Aspect 、@Before、@After、@Around、@AfterReturning、@AfterThrowing等注解

3.SpringAOP的使用步驟

(1)導入SpringAOP依賴坐標
注:spring-context中包含AOP相關依賴

 	<!--spring-context--><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>5.1.0.RELEASE</version></dependency><!--aspect--><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version></dependency>

(2)定義連接點

package com.example.service;public interface IUser {void eat();void sleep();
}
package com.example.service.impl;import com.example.service.IUser;
import org.springframework.stereotype.Service;@Service
public class UserImpl implements IUser {@Overridepublic void eat() {System.out.println("炫飯中... ...");}@Overridepublic void sleep() {System.out.println("深度睡眠中... ...");}
}

(3)定義通知類,制作通知

package com.example.aop;public class MyAdvice {public void advice(){System.out.println("在連接點之前執行的共性功能");}
}

(4)定義切入點
注:切入點定義依托一個不具有實際意義的方法進行,即無參數,無返回值,方法體無實際邏輯

package com.example.aop;import org.aspectj.lang.annotation.Pointcut;public class MyAdvice {@Pointcut("execution(void com.example.service.IUser.eat())")private void pt(){}public void advice(){System.out.println("在連接點之前執行的共性功能");}
}

(5)綁定切入點和通知關系,并指定通知添加到原始連接點的具體執行位置

package com.example.aop;import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;public class MyAdvice {@Pointcut("execution(void com.example.service.IUser.eat())")private void pt(){}@Before("pt()")public void advice(){System.out.println("在連接點之前執行的共性功能");}}

(6)定義通知類受Spring容器管理,并定義當前類為切面類

package com.example.aop;import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.stereotype.Component;@Component
@Aspect// 代表這個類是一個切面
public class MyAdvice {@Pointcut("execution(void com.example.service.IUser.eat())")private void pt(){}@Before("pt()")public void advice(){System.out.println("在連接點之前執行的共性功能");}
}

(7)開啟Spring對AOP注解驅動支持

package com.example.config;import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.EnableAspectJAutoProxy;@Configuration
@ComponentScan("com.example")
@EnableAspectJAutoProxy// 開啟Spring對AOP注解驅動支持
public class SpringConfig {
}

4.SpringAOP的工作流程

(1)Spring容器啟動
(2)讀取所有切面配置中的切入點
(3)初始化Bean,判定Bean對應的類中的方法是否匹配到任意切入點

  • 匹配失敗,創建對象
  • 匹配成功,創建原始對象(目標對象)的代理對象

(4)獲取Bean執行方法

  • 獲取Bean,調用方法并執行,完成操作(對應步驟(3)匹配失敗的情況)
  • 獲取的Bean是代理對象時,根據代理對象的運行模式運行原始方法與增強的內容,完成操作(對應步驟(3)匹配成功的情況)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/711335.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/711335.shtml
英文地址,請注明出處:http://en.pswp.cn/news/711335.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

性能測試-反編譯jar

方法一&#xff0c;使用jd-gui 1、官網下載&#xff1a;Java Decompiler 2、下載mac版本后&#xff0c;解壓&#xff0c;如下所示&#xff1a; 雙擊 JD_GUI&#xff0c;提示錯誤&#xff0c;如下所示&#xff1a; 已經安裝了java 17&#xff0c;是java 1.8以上版本&#xff0…

Unity中URP下實現水體(水面高光)

文章目錄 前言一、實現高光反射原理1、原理&#xff1a;2、公式&#xff1a; 二、實現1、定義 _SpecularColor 作為高光反射的顏色2、定義 _SpecularIntensity 作為反射系數&#xff0c;控制高光反射的強度3、定義 _Smoothness 作為高光指數&#xff0c;用于模型高光范圍4、模擬…

ADO.NET+kafka實現發布訂閱保存到數據庫

??????ADO.NETkafka實現發布訂閱保存到數據庫 在.NET應用程序中&#xff0c;ADO.NET通常用于數據庫操作&#xff0c;而Apache Kafka是一個分布式流處理平臺&#xff0c;它允許發布&#xff08;Producer&#xff09;和訂閱&#xff08;Consumer&#xff09;消息流。使用A…

深入理解c指針(四)

目錄 六、assert斷言 七、指針的使用和傳址調用 1、strlen的模擬實現 2、傳值調用和傳址調用 3、練習-字符串逆序 在深入理解c指針&#xff08;三&#xff09;提到&#xff0c;在實際使用指針前可以檢測其是否指到有效空間&#xff1a; #include<stdio.h> int mai…

度量與評估客戶體驗:以客戶為中心的方法和工具

在當今的市場環境中&#xff0c;客戶體驗已經成為企業成功的關鍵因素。一個優秀的客戶體驗不僅能夠提升客戶滿意度&#xff0c;增強客戶忠誠度&#xff0c;還能夠吸引新的潛在客戶。然而&#xff0c;要實現這一目標&#xff0c;企業首先需要了解如何度量和評估客戶體驗。本文將…

day08_分類品牌管理商品規格管理商品管理

文章目錄 1 分類品牌管理1.1 菜單添加1.2 表結構介紹1.3 頁面制作1.4 品牌列表加載1.4.1 后端接口BrandControllerBrandServiceBrandMapperBrandMapper.xml 1.4.2 前端對接brand.jscategoryBrand.vue 1.5 分類數據加載1.6 列表查詢1.6.1 需求說明1.6.2 后端接口需求分析Categor…

linux nasm匯編中調用printf不報錯,但調用scanf報錯。拋出了分段錯誤(核心轉儲)

當我寫了如下匯編時 ; nasm -f elf64 -g -F dwarf charsin.asm ; gcc charsin.o -no-pie -o charsin ; ld -o eatclib eatclib.o ; gdb eatclib[SECTION .data]SPrompt db Enter string data, followed by Enter: ,0IPrompt db Enter an integer value, followed by Enter: ,1…

Python進階教學一

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 一、函數1.高階函數2.返回函數3.匿名函數4.裝飾器 二、實例1.類和實例2.限制訪問3. 繼承和多態4.實例屬性和類屬性 一、函數 1.高階函數 1.1 map1.2 reduce1.3 fi…

Dsco Dropship EDI需求分析

供應商要想從Dsco處通過EDI獲取訂單&#xff0c;需要部署自己的EDI系統&#xff0c;與Dsco的EDI供應商CommerceHub 建立連接&#xff0c;分為兩個方向&#xff1a; 1.從CommerceHub 的 Dsco 平臺獲取 EDI 850 采購訂單 2.向Dsco發送庫存&#xff08;846&#xff09;、訂單狀態…

MySQL的內外連接

1.內連接 內連接實際上就是利用 WHERE 子句&#xff08;連接條件&#xff09;對兩張表形成的笛卡爾積&#xff08;內連接&#xff09;進行篩選&#xff0c;我們之前學習的查詢基本都是內連接&#xff0c;也是在實際生產中被使用得最多的連接查詢。 另外內連接還可以使用下面的…

Java Swing游戲開發學習7

內容來自RyiSnow視頻講解 這一節實現的是背景音樂和音效的播放。 在這里&#xff0c;背景音樂和音效所用的音頻文件均為wav格式文件。Java SDK默認支持的格式有限&#xff0c;默認不支持mp3格式音樂。 背景音樂、拾取鑰匙、拾取靴子、開門分別有對應的音頻文件。 作者的實現…

2024-02學習筆記

1.當我們向Set集合中添加一個已經存在的元素時 當我們向Set集合中添加一個已經存在的元素時&#xff0c;Set集合會如何處理呢&#xff1f;實際上&#xff0c;Set集合不會將重復的元素添加到集合中。當我們向Set集合中添加一個元素時&#xff0c;Set集合會首先判斷該元素是否已…

Ubuntu-22.04安裝MegaCLI并查看MegaRAID的配置

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄 前言一、MegaRAID二、安裝MegaCLI1.Ubuntu-18.042.Ubuntu-22.043.Ubuntu-20.044.CentOS-75.其它發行版 三、使用MegaCLI1.查看所有適配器信息2.查看所有物理磁盤信息…

華為配置WLAN高密業務示例

配置WLAN高密業務示例 組網圖形 圖1 配置高密WLAN環境網絡部署組網圖 業務需求組網需求數據規劃配置思路配置注意事項操作步驟配置文件 業務需求 體育場由于需要接入用戶數量很大&#xff0c;AP間部署距離較小&#xff0c;因此AP間的干擾較大&#xff0c;可能導致用戶上網網…

新王炸:文生視頻Sora模型發布,能否引爆AI芯片熱潮

前言 前方高能預警&#xff0c;Sora來襲&#xff01; 淺析Sora的技術亮點 語言模型中構建關鍵詞聯系 視頻素材分解為時空碎片 擴散模型DiT Not for play, But change world! OpenAI的宏大目標 未來已來&#xff0c;只是尚未流行 Sora的成本與OpenAI的7萬億美金豪賭 算…

【探索AI】人人都在講AIGC,什么是AIGC?

AIGC 概述示例展示我們日常用到的一些工具/應用核心技術介紹核心技術的算法解析案例及部分代碼實現1. 藝術作品2. 設計項目3. 影視特效4. 廣告創意總結 一張圖先了解下&#xff1a; 概述 "人工智能生成創造&#xff08;Artificial Intelligence Generated Content&#x…

從CPU緩存結構到原子操作

一、CPU緩存結構 1.1 CPU的多級緩存 因為CPU的計算速度非常快&#xff0c;但內存的訪問速度相對較慢。因此&#xff0c;如果CPU每次都要從內存讀取數據&#xff0c;會造成大量的等待時間&#xff0c;降低整體性能。 通過引入多級緩存&#xff0c;可以在CPU和內存之間建立數據…

vue3中實現elementPlus表格選中行的上移下移

先看效果&#xff1a; 實現步驟&#xff1a; 1、給el-table添加current-change事件、高亮屬性及ref屬性 2、給上移下移按鈕添加事件 // 定義當前選中的行參數 const currentRow ref<any>(null); // 定義表格的ref const singleTableRef ref(); // 行選中事件 const ha…

正信晟錦:借了錢的人一直不接電話不回信息咋辦

在金錢往來中&#xff0c;遇到借出的錢款無法按時回收&#xff0c;且借款人如同人間蒸發一般不接電話、不回信息&#xff0c;確實讓人焦慮。面對這種情形&#xff0c;我們需采取明智而有效的措施&#xff0c;以保護自身的權益。 首要策略是保持冷靜&#xff0c;不要讓情緒主導行…

四、《任務列表案例》后端程序實現和測試

本章概要 準備工作功能實現前后聯調 4.1 準備工作 數據庫腳本 CREATE TABLE schedule (id INT NOT NULL AUTO_INCREMENT,title VARCHAR(255) NOT NULL,completed BOOLEAN NOT NULL,PRIMARY KEY (id) );INSERT INTO schedule (title, completed) VALUES(學習java, true),(學…