1. 程式人生 > >探析Spring AOP(二):Spring AOP的實現機制

探析Spring AOP(二):Spring AOP的實現機制

  Spring AOP 屬於第二代 AOP, 採用動態代理機制和位元組碼生成技術實現
  與最初的 AspectJ 採用編譯器將橫切邏輯織入目標物件不同,動態代理機制和位元組碼生成都是在執行期間為目標物件生成一個代理物件,而將橫切邏輯織入到這個代理物件中,系統最終使用的是織入了橫切邏輯的代理物件,而不是真正的目標物件

一、動態代理

  我們可以為指定的介面在系統執行期間動態的生成代理物件, 從而幫助我們走出最初使用靜態代理實現 AOP 的窘境
  動態代理機制的實現主要由 java.lang.reflect.Proxy 類和java.lang.reflect.InvocationHandler介面。
  詳細使用請看:

Java設計模式之—靜態代理和動態代理
  
  動態代理的缺點:動態代理只能對實現了相應Interface的類使用,如果某個類沒有實現任何的Interface,就無法使用動態代理對其產生相應的代理物件!
  因此:在預設情況下,如果Spring AOP發現目標實現了相應的Interface,則採用動態代理為其生成代理物件例項;而如果目標物件沒有實現任何的Interface,Spring AOP會嘗試使用CGLIB動態位元組碼生成類庫,為目標物件生成代理物件例項!

二、CGLIB動態位元組碼生成

  使用CGLIB擴充套件物件行為的原理是:對目標物件進行繼承擴充套件,為其生成相應的子類,而子類可以通過覆寫來擴充套件父類的行為,只要將橫切邏輯的實現放到子類中,然後讓系統使用擴充套件後的目標物件的子類,就可以達到與代理模式相同的效果了。


  記住:相比於動態代理,CGLIB的優勢就是,可以為沒有實現任何介面的類進行擴充套件

  例如:
  目標類如下:(這裡不實現任何介面

public class Requestable {  

    public void request() {  
        System.out.println("requestable without implementint any interface");  
    }  
}  

  要對該類進行繼承擴充套件,所以我們要使用CGLIB類庫,實現一個net.sf.cglib.proxy.Callback,或者使用net.sf.cglib.proxy.MethodInterceptor(繼承自Callback)

import java.lang.reflect.Method;  

import org.joda.time.TimeOfDay;  

import net.sf.cglib.proxy.MethodInterceptor;  
import net.sf.cglib.proxy.MethodProxy;  

public class RequestCallback implements MethodInterceptor {  

    public Object intercept(Object object, Method method, Object[] args, MethodProxy proxy) throws Throwable {  
        if(method.getName().equals("request")) {  
            System.out.println("你呼叫了request方法")
            return proxy.invokeSuper(object, args);  
        }  
        return null;  
    }  

}  

  到了這裡,我們使用MethodInterceptor為request方法實現了對request請求進行控制的邏輯
  然後我們現在通過Enhancer為目標物件動態生成一個子類,將RequestCallback的橫切邏輯附加到該子類中:

import net.sf.cglib.proxy.Enhancer;  

public class Client {  

    public static void main(String[] args) {  
        Enhancer enhancer = new Enhancer();  
        //設定父類
        enhancer.setSuperclass(Requestable.class);  
        //設定Callback
        enhancer.setCallback(new RequestCallback());  

        Requestable proxy = (Requestable) enhancer.create();  
        proxy.request();  
    }  
}  

  結果如下:
  你呼叫了request方法
  requestable without implementint any interface

  缺點:使用 CGLIB 對類進行擴充套件的唯一限制就是 無法對 final 方法進行覆寫

三、總結

  以上兩種技術(動態代理 與 動態位元組碼生成) 就是 Spring AOP 所使用的核心技術,也就是 Spring AOP 的Weaving And Weaver 的實現原理了

相關推薦

Spring AOPSpring AOP實現機制

  Spring AOP 屬於第二代 AOP, 採用動態代理機制和位元組碼生成技術實現 。   與最初的 AspectJ 採用編譯器將橫切邏輯織入目標物件不同,動態代理機制和位元組碼生成都是在執行期間為目標物件生成一個代理物件,而將橫切邏輯織入到這個代理物件中

白話Spring原始碼spring原始碼分享的思路

做事先列個大綱,這樣思路清晰了才不會亂。 這次spring原始碼系列的部落格每個字我都堅持自己手敲,然後文采不好,但是真實。希望大家喜歡。 大綱: 1.spring框架的理解 2.beanfactory:怎麼建立bean的,怎麼載入xml中bean的定義的 3.AOP 4.a

Spring AOPSpring AOP的底層實現原理

一、前言   前面第一篇我們講到了AOP的概念和使用,第二篇也講到了 AOP的實現機制,在第一篇,講到了joinpoint,pointcut,aspect,weave等AOP的核心概念,接下來我們詳解分析他們的實現原理!   在動態代理 和 CGLIB 的支

Spring Cloud服務註冊與發現 Eureka【Finchley 版】

LEDE .com Go eureka clean 英文逗號 開始 效果 sam Spring Cloud(二):服務註冊與發現 Eureka【Finchley 版】 發表於 2018-04-15 | 更新於 2018-05-07 | 上一篇主要介紹了相關理論,這一

Spring Boot Redis和日誌

接著上篇內容繼續往下執行。 首先pom.xml 新增redis的引用,因為開始建專案沒有,自動生成redis的引用,然後手動新增進去。 新增成功以後看我們的配置檔案 新增我們的日誌類和快取 快取方法 結果: http://localhost:8080/set?key=lxh2&

微服務學習筆記Spring Cloud

2. Spring Cloud Spring Cloud作為Java語言的微服務框架,依賴於Spring Boot,具有快速開發、持續交付、易於部署等特點。 2.1 微服務應該具備的功能 微服務的特點: 按照業務劃分服務。每個微服務執行在獨立的程序中,有獨立的

Spring Security2.2 History

Spring Security began in late 2003 as "The Acegi Security System for Spring". A question was posed on the Spring Developers' mailing list asking whether th

Spring Security2.1 Introduction What is Spring Security?

Spring Security provides comprehensive security services for Java EE-based enterprise software applications. There is a particular emphasis on supporting p

spring boot熱部署

熱部署作用: 在修改程式碼後無需重啟專案即可生效,提高開發效率。 部署方法如下: 首先,在pom.xml中引入依賴 <!-- 熱啟動 --> <dependency> <groupId>org.springframework.bo

Spring Boot實戰1——入口程式類

import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.Sprin

微服務架構實戰篇Spring boot2.0 + Swagger2 讓你的API視覺化

簡介 該專案主要利用Spring boot2.0 +Swagger2 方便進行測試後臺的restful形式的介面,實現動態的更新,當我們在後臺的介面修改了後,swagger可以實現自動的更新,而不需要認為的維護這個介面進行測試。 原始碼地址 GitHub:https:

Spring Boot快速搭建web專案或微服務

上一篇部落格對spring boot的來世今生進行了介紹,這篇就帶領大家快速的建立一個spring boot的web專案或者微服務。 一、.新建專案 1.方法一 (1)自己建立java工程 (2)新建spring boot的application (3

SSH系列Spring + Hibernate + SpringMVC Maven整合

宣告:本文是關於Spring4.3.2 + Hibernate5.1.0 + SpringMVC Maven方式的簡單整合。pom.xml只添加了最基本的依賴,實際開發中需要的依賴根據專案具體新增; 本文不詳細說明maven安裝與使用。不當的地方歡迎大家指正,不

Spring ConfigurationBean的Scope

Scope描述的是Spring容器如何新建Bean的例項,通過@Scope註解來實現:    Spring容器最初提供了兩種bean的scope型別:singleton和prototype,但釋出2.0以後,又引入了另外三種scope型別:request、session和gl

Spring核心探索與總結Spring容器初始化原始碼探索

Spring容器概述 容器是spring的核心,Spring容器使用DI管理構成應用的元件,它會建立相互協作的元件之間的關聯,負責建立物件,裝配它們,配置它們並管理它們的生命週期,從生存到死亡(在這裡,可能就是new 到 finalize())。 Sprin

Spring系列Spring AOP詳解

一、AOP是什麼   AOP(面向切面程式設計),可以說是一種程式設計思想,其中的Spring AOP和AspectJ都是現實了這種程式設計思想。相對OOP(面向過程程式設計)來說,提供了另外一種程式設計方式,對於OOP過程中產生的橫切性問題,這些橫切性與業務無關,可以通過預編譯方式和執行期動態代理來實現。比

Spring系列Spring AOP原始碼解析

一、@EnableAspectJAutoProxy註解   在主配置類中新增@EnableAspectJAutoProxy註解,開啟aop支援,那麼@EnableAspectJAutoProxy到底做了什麼?接下來分析下:    @EnableAspectJAutoProxy點進去如下: &nb

Spring Boot 模版引擎 Thymeleaf 渲染 Web 頁面

Spring Boot (二):模版引擎 Thymeleaf 渲染 Web 頁面 在《Spring Boot(一):快速開始》中介紹瞭如何使用 Spring Boot 構建一個工程,並且提供 RESTful API ,本節我們繼續介紹如何使用 Spring Boot 渲染 Web 頁面。 1. 什麼是

Spring CloudEureka 服務註冊中心

前言 服務治理 隨著業務的發展,微服務應用也隨之增加,這些服務的管理和治理會越來越難,並且叢集規模、服務位置、服務命名都會發生變化,手動維護的方式極易發生錯誤或是命名衝突等問題。而服務治理正是為了解決這個問題,服務治理是微服務架構中最為核心和基礎的模組,它主要實現各個微服務例項的自動化註冊和發現。 服務註

Spring CloudWeb服務客戶端之Ribbon

上文介紹了服務如何通過Eureka實現註冊,以及如何從Eureka獲取已經註冊的服務列表。那麼拿到註冊服務列表後, 如何進行服務呼叫?一個簡單的實現是可以從被呼叫服務的例項列表中選擇一個服務例項,通過其hostname(或IP),埠,及API的路徑拼接成完整的url,通過http client來完成呼叫。但生