中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Spring中AOP的原理和作用是什么

發布時間:2021-06-29 11:36:39 來源:億速云 閱讀:748 作者:chen 欄目:開發技術

這篇文章主要介紹“Spring中AOP的原理和作用是什么”,在日常操作中,相信很多人在Spring中AOP的原理和作用是什么問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Spring中AOP的原理和作用是什么”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

1 什么是AOP?

1.1 概念介紹

Spring的使命是簡化Java代碼開發,aop作為Spring的一個子模塊,也不例外。

AOP 是 Aspect Oriented Programming(面向切面編程)  的簡稱,和OOP(面向對象編程)一樣是一種編程思想,是對OOP的一種補充。

如何理解什么是AOP呢?以日志為例,在很多管理系統,比如訂單系統、推送系統等等都需要把日志記錄下來。如果每個業務邏輯里面都寫日志的相關代碼,那就重復太多了。

干脆把日志的相關邏輯代碼,統一封裝起來。然后在需要的地方嵌入即可。AOP也主要就是做嵌入這件事的。看下面這張圖。

Spring中AOP的原理和作用是什么

新增訂單編輯訂單取消訂單推送訂單日志事務

AOP旨在將橫切關注點(crosscutting  concern)從業務主體邏輯中進行剝離,實現關注點分離,以提高程序的模塊化程度(及業務模塊只需關注業務邏輯,無需關注日志、安全、事務等通用邏輯)

上面提到了一些名詞,比如說,切面、關注點、橫切等,下面對這些名詞進行解釋。

1.2 名詞解釋

AOP有自己的一套術語,我們必須了解一下這些行話,才能更好地理解AOP。為了方便大家理解,下面將用課代表收作業作為例子。

通知 (Advice)

定義了在收作業前后需要做的事。常見的通知類型有:before、after、after-returning、around等。

連接點 (JoinPoint)

連接點指程序運行時允許插入切面的一個點,可以是一個函數、一個包路徑、一個類、或者拋出的異常。有點類似于可以收作業的時間點。

切點(PointCut)

切點用于定義切面的位置,也就是捕獲哪些連接點的調用然后執行"通知"的操作(什么地點)。

切面(Aspect)

切面是切點和通知的聚合,定義了在哪一個切點做什么通知。

目標對象( Target )

指被切面織入的對象。

引入(Introduction)

引入允許我們向現有的類添加新方法或屬性。

織入(Weaving)

織入是把切面應用到切點對應的連接點的過程。切面在指定連接點被織入到目標對象中。

具體關系使用圖形化表示是:

Spring中AOP的原理和作用是什么

2 為什么要引入AOP?

上面是定義,引入AOP的原因肯定是可以解決目前開發中存在的某些痛點:

(1)目前的開發當中,相互之間都是模塊化開發,使用AOP可以有效的實現模塊化的思路。

(2)將輔助邏輯(日志、安全、監控等)從業務主體邏輯中進行剝離,同步進行開發。

AOP是一種思想,這種思想是把一些業務邏輯剝離開,然后按照主業務邏輯進行組合,最后達到想要的功能邏輯。

3 如何簡單的實現AOP?

3.1 AOP編程思路

本圖是一個簡單的思路。

Spring中AOP的原理和作用是什么

明確需求創建切面類定義切點定義通知思考:要在哪個方法的什么時候做什么事(方法前?方法后?還是around  ?)即選擇哪個連接點進行執行通知在切點附近(before?after?) 做什么操作

下面定義一個日志的簡單案例,實現AOP。使用的是原始的注解方式:

3.2 案例實現AOP

3.2.1 明確需求

在某個方法上加上@FddLog,就會在執行這個方法的前后,自動輸出相應的信息。下面以把大象放進冰箱為例子進行演示:

3.2.2 基本接口和實現

public interface ElephentToRe{   public void toRe(); }

實現類如下:

public class ElephentToReImpl implements ElephentToRe{   public void toRe() {     System.out.println("把大象放冰箱");   } }

3.2.3 定義切面和通知

public class ElephentToReHelper{     public void beforeElephentToRe(){         System.out.println("把冰箱門打開");     }     public void afterElephentToRe(){         System.out.println("把冰箱門關上");     } }

配置就好了

<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans"   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"   xsi:schemaLocation="http://www.springframework.org/schema/beans   http://www.springframework.org/schema/beans/spring-beans-3.0.xsd   http://www.springframework.org/schema/aop   http://www.springframework.org/schema/aop/spring-aop-3.0.xsd ">   <!-- 定義通知內容,也就是切入點執行前后需要做的事情 -->   <bean id="elephentToReHelper" class="com.fdd.bean.ElephentToReHelper"></bean>   <!-- 定義被代理者 -->   <bean id="elephentToReImpl" class="com.fdd.bean.ElephentToReImpl"></bean>   <aop:config>     <aop:aspect ref="elephentToReHelper">       <aop:before method="beforeElephentToRe" pointcut="execution(* *.toRe(..))" />       <aop:after method="afterElephentToRe" pointcut="execution(* *.toRe(..))" />     </aop:aspect>   </aop:config> </beans>

3.2.4 測試看效果

public class Test {   public static void main(String[] args){     @SuppressWarnings("resource")     ApplicationContext appCtx = new FileSystemXmlApplicationContext("application.xml");     ElephentToRe elephentToReImpl = (ElephentToRe)appCtx.getBean("elephentToReImpl");     elephentToReImpl.toRe();   } }

上面的這種方法是通過純粹的POJO切面來完成的。實現方式也比較簡單。

4 我對AOP思想的看法

任何新技術的出現都是為了解決目前開發中存在的某些痛點。對于aop來說,其主要是把一些功能代碼進行抽象封裝,和主業務邏輯代碼進行剝離。在需要的地方進行織入即可。

我的看法是

(1)在平時開發代碼的時候,完全可以把一些常見的,常用的功能代碼進行封裝,盡量做到動態配置。不同的功能模塊只需要進行織入即可。

(2)定義業務邏輯的模板,比如說如果要解決某一個業務功能,如果頁面類似,可以按照基本的框架進行組合,然后使用配置平臺進行可控化配置即可。

到此,關于“Spring中AOP的原理和作用是什么”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續學習更多相關知識,請繼續關注億速云網站,小編會繼續努力為大家帶來更多實用的文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

万全县| 拜泉县| 房山区| 芒康县| 高台县| 汉源县| 华池县| 永春县| 锡林郭勒盟| 广南县| 辰溪县| 乳源| 茌平县| 读书| 葫芦岛市| 绥江县| 沙雅县| 七台河市| 常山县| 麻江县| 阿克苏市| 永泰县| 靖安县| 枣阳市| 县级市| 莎车县| 历史| 姚安县| 铅山县| 鄄城县| 丰镇市| 和林格尔县| 峨山| 隆昌县| 浦城县| 阜新市| 江孜县| 含山县| 合川市| 巴林左旗| 兴业县|