1. 程式人生 > >面向切面程式設計AOP

面向切面程式設計AOP

看到一高贊回答有Bug,所以還是簡單說幾句吧。

先上結論:AOP不一定都像Spring AOP那樣,是在執行時生成代理物件來織入的,還可以在編譯期、類載入期織入,比如AspectJ。

下面再慢慢聊AOP。
什麼時候要用到面向切面AOP呢?
舉個例子,你想給你的網站加上鑑權,
對某些url,你認為不需要鑑權就可以訪問,
對於某些url,你認為需要有特定許可權的使用者才能訪問
如果你依然使用OOP,面向物件,
那你只能在那些url對應的Controller程式碼裡面,一個一個寫上鑑權的程式碼
而如果你使用了AOP呢?那就像使用Spring Security進行安全管理一樣簡單(更新:Spring Security的攔截是基於Servlet的Filter的,不是aop,不過兩者在使用方式上類似):

protected void configure(HttpSecurity http) throws Exception {
      http
        .authorizeRequests()
           .antMatchers("/static","/register").permitAll()
           .antMatchers("/user/**").hasRoles("USER", "ADMIN") 

這樣的做法,對原有程式碼毫無入侵性,這就是AOP的好處了,把和主業務無關的事情,放到程式碼外面去做。

所以當你下次發現某一行程式碼經常在你的Controller裡出現,比如方法入口日誌列印,那就要考慮使用AOP來精簡你的程式碼了。

聊完了AOP是啥,現在再來聊聊實現原理。AOP像OOP一樣,只是一種程式設計正規化,AOP並沒有規定說,實現AOP協議的程式碼,要用什麼方式去實現。

比如上面的鑑權的例子,假設我要給UserController的saveUser()方法加入鑑權,第一種方式,我可以採用代理模式,
什麼是代理模式,就是我再生成一個代理類,去代理UserController的saveUser()方法,程式碼大概就長這樣:

class UserControllerProxy {
    private UserController userController;

    public void saveUser
() { checkAuth(); userController.saveUser(); } }

這樣在實際呼叫saveUser()時,我呼叫的是代理物件的saveUser()方法,從而實現了鑑權。

代理分為靜態代理和動態代理,靜態代理,顧名思義,就是你自己寫代理物件,動態代理,則是在執行期,生成一個代理物件。

Spring AOP就是基於動態代理的,如果要代理的物件,實現了某個介面,那麼Spring AOP會使用JDK Proxy,去建立代理物件,而對於沒有實現介面的物件,就無法使用JDK Proxy去進行代理了(為啥?你寫一個JDK Proxy的demo就知道了),這時候Spring AOP會使用Cglib,生成一個被代理物件的子類,來作為代理,放一張圖出來就明白了:
這裡寫圖片描述
好,上面講的是AOP的第一種實現,執行時織入。

但是不是所有AOP的實現都是在執行時進行織入的,因為這樣效率太低了,而且只能針對方法進行AOP,無法針對建構函式、欄位進行AOP。

我完全可以在編譯成class時就織入啊,比如AspectJ,當然AspectJ還提供了後編譯器織入和類載入期織入,這裡我就不展開討論了,我只是來澄清一下大家對AOP的誤解,
有興趣繼續學習的,可以看一下這篇部落格:
Comparing Spring AOP and AspectJ

相關推薦

spring面試題(四):面向切面程式設計AOP+MVC

Spring面向切面程式設計(AOP) 1.  解釋AOP 面向切面的程式設計,或AOP, 是一種程式設計技術,允許程式模組化橫向切割關注點,或橫切典型的責任劃分,如日誌和事務管理。   2. Aspect 切面 AOP

【ABP雜燴】面向切面程式設計(AOP)知識總結

目錄 1.存在問題 2.AOP的概念 3.AOP應用範圍 3.AOP實現方式 4.應用舉例 5.結束語 本文在學習【老張的哲學】系列文章AOP相關章節後,自己歸納總結的筆記。 1.存在問題 最近,其它專案小組在開發的過程中遇到了一個問題,在日誌記錄時,使用者明明點選的是更新操作,可翻看記

Spring核心技術面向切面程式設計AOP

這種在執行時,動態地將程式碼切入到類的指定方法、指定位置上的程式設計思想就是面向切面的程式設計。 個人理解就是動態代理,舉例:web中的攔截器就是個典型動態代理。 面向切面程式設計(AOP是Aspect Oriented Program的首字母縮寫) ,

Spring學習手札(二)面向切面程式設計AOP

AOP理解   Aspect Oriented Program面向切面程式設計,通過預編譯方式和執行期動態代理實現程式功能的統一維護的一種技術。   但是,這種說法有些片面,因為在軟體工程中,AOP的價值體現的並不是程式碼方面,更多的是為了專案的模組化,而不僅僅是為了減少重複程式碼。   AOP是一種程

面向切面程式設計(AOP)

結合設計模式,通過程式碼理解面向切面程式設計 通過,結構型設計模式,裝飾器模式來實現AOP /// <summary> /// 裝飾器模式實現靜態代理 /// AOP 在方法前後增加自定義的方法 /// </summary> public class

Python語言特性-面向切面程式設計AOP

我們先來解釋一下AOP的概念。 AOP概念及作用 AOP 即面向切面程式設計,指擴充套件功能不修改原始碼,將功能程式碼從業務邏輯程式碼中分離出來。 主要作用就是將類似於日誌記錄,效能統計,安全控制,事務處理,異常處理等重複性的程式碼塊從業務邏輯程式碼中劃分出來,對這些行為的分離。

前端解讀面向切面程式設計(AOP)

前言 面向物件(OOP)作為經典的設計正規化,對於我們來說可謂無人不知,還記得我們入行起始時那句經典的總結嗎-萬事萬物皆物件。 是的,基於OOP思想封裝、繼承、多型的特點,我們會自然而然的遵循模組化、元件化的思維來設計開發應用,以到達易維護、可擴充套件、高複用的目的。 既然OOP這麼多優點,那麼經常被大家提起

關於面向切面程式設計AOP

什麼是AOP AOP Aspect Oriented Programing 面向切面程式設計 AOP採取橫向抽取機制,取代了傳統縱向繼承體系重複性程式碼(效能監視、事務管理、安全檢查、快取) Spring AOP使用純Java實現,不需要專門的編譯過程和類載入器

Java面試之面向切面程式設計AOP的原理,

            最近在面試,所以複習了一些Java概念方面的內容,AOP--有段話我感覺說的很清楚了:這種在執行時,動態地將程式碼切入到類的指定方法、指定位置上的程式設計思想就是面向切面的程式

spring關於面向切面程式設計AOP的操作

首先說明:用一個要在進行增刪改操作的時候進行日誌資訊新增的操作來介紹AOP 1、首先需要在spring配置檔案applicationContext.xml中進行相應的配置 配置<aop:aspectj-autoproxy/>這樣一句話 <?xml version="

什麼是面向切面程式設計(AOP)

這種在執行時,動態地將程式碼切入到類的指定方法、指定位置上的程式設計思想就是面向切面的程式設計。 AOP是Spring提供的關鍵特性之一。AOP即面向切面程式設計,是OOP程式設計的有效補充。使用AOP技術,可以將一些系統性相關的程式設計工作,獨立提取出來,獨立實現,然

什麼是面向切面程式設計AOP

   面向切面程式設計(AOP是Aspect Oriented Program的首字母縮寫) ,我們知道,面向物件的特點是繼承、多型和封裝。而封裝就要求將功能分散到不同的物件中去,這在軟體設計中往往稱為職責分配。實際上也就是說,讓不同的類設計不同的方法。這樣程式碼就分散到一個個的類中去了。這樣做的好處是降低了

筆記——spring基本使用(控制反轉IOC、面向切面程式設計AOP、宣告式事務,事務隔離級別、事務傳播)

spring溫習筆記 Spring是一個開放原始碼的設計層面框架,他解決的是業務邏輯層和其他各層的鬆耦合問題,因此它將面向介面的程式設計思想貫穿整個系統應用。 Spring 的控制反轉IOC、面向切面程式設計AOP等特性不多說。 本文核心內容:搭建一個Spring Dem

面向切面程式設計AOP

看到一高贊回答有Bug,所以還是簡單說幾句吧。 先上結論:AOP不一定都像Spring AOP那樣,是在執行時生成代理物件來織入的,還可以在編譯期、類載入期織入,比如AspectJ。 下面再慢慢聊AOP。 什麼時候要用到面向切面AOP呢? 舉個例

什麼是面向切面程式設計AOP?

下面再慢慢聊AOP。什麼時候要用到面向切面AOP呢?舉個例子,你想給你的網站加上鑑權,對某些url,你認為不需要鑑權就可以訪問,對於某些url,你認為需要有特定許可權的使用者才能訪問如果你依然使用OOP,面向物件,那你只能在那些url對應的Controller程式碼裡面,一個一個寫上鑑權的程式碼而如果你使用了

SpringBoot面向切面程式設計AOP之日誌攔截

在pom.xml下增加 <dependency> <groupId>org.springframework.boot</groupId>

什麼是面向切面程式設計AOP

昨天說了IoC,今天來說AOP。 IoC和AOP這兩個縮寫總是一起出現。在形式上,兩者同為三個字母的縮寫,而且第二個字母都是O,有對仗美;在性質上,兩者同為Spring的核心技術和特色,是最常被提起的概念。 但與面向切面程式設計AOP真正對應的,是OOP,即面向物件程式設計。 未說面向切面,先說面向過程。

Spring框架學習筆記(2)——面向切面程式設計AOP

介紹 概念 面向切面程式設計AOP與面向物件程式設計OOP有所不同,AOP不是對OOP的替換,而是對OOP的一種補充,AOP增強了OOP。 假設我們有幾個業務程式碼,都呼叫了某個方法,按照OOP的思想,我們就會將此方法封裝在一個類中,之後通過物件.方法名呼叫 我們可以看作我們的業務程式碼被其他程式碼入侵或者是

[譯]如何在ASP.NET Core中實現面向切面程式設計(AOP)

> 原文地址:[ASPECT ORIENTED PROGRAMMING USING PROXIES IN ASP.NET CORE](https://blog.zhaytam.com/2020/08/18/aspnetcore-dynamic-proxies-for-aop/) > 原文作者:ZANID HA

【小家java】POP(面向過程程式設計)、OOP(面向物件程式設計)、AOP面向切面程式設計)三種程式設計思想的區別和聯絡

相關閱讀 【小家java】java5新特性(簡述十大新特性) 重要一躍 【小家java】java6新特性(簡述十大新特性) 雞肋升級 【小家java】java7新特性(簡述八大新特性) 不溫不火 【小家java】java8新特性(簡述十大新特性) 飽受讚譽 【小家java】java9