SpringAOP之靜態代理

来源:http://www.cnblogs.com/demoMeng/archive/2016/09/18/5880909.html
-Advertisement-
Play Games

一、SpringAOP: ⒈AOP:Aspect Oriented Programming 面向切麵編程, 實現的是核心業務和非核心業務之間的的分離,讓核心類只做核心業務,代理類只做非核心業務。 ⒉目的: ⑴、把核心業務和非核心業務進行分離 ⑵、把多個非核心業務處理(點)變成一個切麵(之前的非核心業 ...


一、SpringAOP:

   

   ⒈AOP:Aspect Oriented Programming 面向切麵編程, 實現的是核心業務和非核心業務之間的的分離,讓核心類只做核心業務,代理類只做非核心業務。

    目的:  

      ⑴、把核心業務和非核心業務進行分離    

       ⑵、把多個非核心業務處理(點)變成一個切麵(之前的非核心業務代碼需要寫多次變成只需要寫一次。)

   ⒊要求:只有當核心類中有多個業務需要進行處理的時候使用AOP較為合理,如果只有一個業務需要被處理那麼就沒有必要使用AOP了。

 

 

二、靜態代理:

   1、需要知道核心類(被代理類)是哪一個類,並且有什麼方法。 

   2、非核心的代碼需要重覆寫多次,顯得代碼的結構臃腫,形成代碼冗餘。

   3、非核心類(代理類)需要實現核心類(被代理類)實現的介面,也就是他們需要實現共同的介面,但是以核心類實現的介面(被代理類)為準。

 

 

三、動態代理:

   1、不需要知道核心類(被代理類)具體是什麼類。

   2、非核心類(代理類)需要實現InvocationHandler介面。   

 

四、靜態代理示例:

    1、業務介紹:

      假定高三學生為核心類,學生的家人是代理類。高三學生需要做的核心業務有:在家學習(studyAtHome)、在學校學習(studyAtHome);家人需要做的非核心業務為:準備飯菜(買、洗、炒、煮飯)。準備補品(購買、熬制、加佐料)。

    2、具體代碼:

      ⑴、創建一個高三學生的介面:G3Student

        

package aop_001;


//首先定義一個介面,用來高三學生來是實現, //在這個介面中聲明一個在家學習和一個在學校學習的方法
public interface G3Student { public void studyAtHome(String core); public void studyAtSchool(String core); }

 

  

       ⑵、創建一個高三學生實現類:G3Student_boy,並且這個類實現高三學生介面(G3Student)

  

package aop_001;


//定義一個高三男孩的類(目標對象、核心對象、target對象),實現了高三學生的介面。
public class G3Student_boy implements G3Student {

    
    //高三男孩 的第一個業務流程:在家學習
    public void studyAtHome(String core) {
//核心的事情在家學習。 System.out.println(core+"在HOME學習"); } //高三男孩 的第二個業務流程:在學校學習 public void studyAtSchool(String core) { //核心的事情在家學習。 System.out.println(core+"在SCHOOOL學習"); } }

        

        ⑶、創建一個高三學生的代理類:G3Student_proxy,並且實現了高三學生介面:G3Student。紅色字體需要理解

package aop_001;
/*
*    代理對象(G3Student_proxy)的目的是幫助核心對象(G3Student_boy / G3Student_girl)做非核心的事情。
*    但是代理對象(G3Student_proxy)必須和核心對象(G3Student_boy / G3Student_girl)實現共同的介面。
*/
public class G3Student_proxy implements G3Student {

    
    //定義一個高三學生介面 作為屬性,目的是就是在處理完代理需要做的事情之後調用高三男孩或者是高三女孩需要做的核心業務,
    //但是不是代理具體去做這些核心的事情,只是調用它們而已。    
    private G3Student G3S;
    
    
    //創建一個代理的參數為 高三學生介面 的構造函數,判斷但傳入的字元串為boy就構造一個高三男孩的實例,如果傳入的參數為girl就構造一個高三女孩的實例。
    public G3Student_proxy(String sex) {
        if("boy".equals(sex)){
            G3S = new G3Student_boy();
        }else if("girl".equals(sex)){
            G3S = new G3Student_girl();
        }        
    }
public void studyAtHome(String core){ //這個是代理(G3Student_proxy)準備飯菜的需要做的流程: System.out.println("代理:準備買菜"); System.out.println("代理:準備洗菜"); System.out.println("代理:準備炒菜"); System.out.println("代理:準備煮飯"); System.out.println("-----------------"); //通過定義的屬性,並且在調用G3Student_proxy的含參數的構造函數創建相對應的實例,調用這個具體的實例的方法 G3S.studyAtHome(core);
    
//這個是代理(G3Student_proxy)準備補品的需要做的流程: System.out.println("-----------------"); System.out.println("代理 :購買補品"); System.out.println("代理 :熬制部品"); System.out.println("代理 :加入佐料"); System.out.println(); } public void studyAtSchool(String core) { //這個是代理準備(G3Student_proxy)飯菜的需要做的流程: System.out.println("代理:準備買菜"); System.out.println("代理:準備洗菜"); System.out.println("代理:準備炒菜"); System.out.println("代理:準備煮飯"); System.out.println("-----------------"); //通過定義的屬性,並且在調用G3Student_proxy的含參數的構造函數創建相對應的實例,調用這個具體的實例的方法 G3S.studyAtSchool(core);
System.out.println(
"-----------------"); //這個是代理(G3Student_proxy)準備補品的需要做的流程: System.out.println("代理 :購買補品"); System.out.println("代理 :熬制部品"); System.out.println("代理 :加入佐料"); System.out.println(); } }

 

        

        ⑷、進行測試:定義一個測試類 Test

package aop_001;

public class Test {

    public static void main(String[] args) {
        
        
        //創建一個代理對象,並且傳入相對應的參數構造出具體的實例
        G3Student b = new G3Student_proxy("boy");
        //通過這個代理對象執行相關的方法(代理對象和核心對象有共同介面)
        b.studyAtHome("小明");
        b.studyAtSchool("小明");

    }

}

 

        測試結果:

                               

 

   3、小結:

      由上面的例子我們可以簡單模擬一個靜態代理的實例,但是我們發現,這個代理做的事情會因為核心對象業務多而變得多起來,而且這些代理做的事情都是相同的沒有變化的:

                       

      並且,如果我們要修改這些流程中的某一個流程的時候會發現要改多處,而且都是相同的代碼,所以這個時候使用動態代理就可以輕鬆解決這個問題。

 

 


 

               謝謝瀏覽 !

     

 

 

 

 

     


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 關於 DotNetBar for Windows Forms 12.9.0.0_冰河之刃重打包版 11.8.0.8_冰河之刃重打包版 基於 官方原版的安裝包 + http://www.cnblogs.com/tracky 提供的補丁DLL製作而成。安裝之後,直接就可以用了。省心省事。不必再單獨的打一 ...
  • 為瞭解決單機處理的瓶頸,增強軟體的可用性,我們需要將軟體部署在多台伺服器上啟用多個二級子功能變數名稱以頻道化的方式,根據業務功能將網站分佈部署在獨立的伺服器上,或通過負載均衡技術(如:DNS輪詢、Radware、F5、LVS等)讓多個頻道共用一組伺服器。當我們將網站程式分部到多台伺服器上後,由於Sessio... ...
  • 從14年11月的實習到正式的工作的工作我在上一家公司工作一年多了。然而到16年5月20跳槽後自己已經好久都沒有在寫博客了,在加上回學校畢業答辯3天以及拿檔案中途耽擱了幾天的時間,跳槽後雖然每天都在不停的搞開發做項目天天忙的就如狗一樣,確實是沒有時間整理以及總結和發表自己的感慨。難得中秋銀行的事情搞完 ...
  • 項目需求: 某學校訂單截止操作時間的上一個月最後一天晚上23:59:59 為止所有支付的訂單統計; 代碼: 圖片: 利用DateTime.Parse();將string類型的時間轉換為datetime類型,我們看一下後面的代碼,是將時間手動的設置為我們需要的時間。 這樣我們設置了值。 封裝取時間的方 ...
  • 題目要求:用戶隨機輸入字母及數字組成的字元串,當用戶連續輸入字元串‘hello’時,程式結束用戶輸入,並分別顯示用戶輸入的字母及數字的數目。 代碼: 題目解析:首先這道題目要求用戶輸入字元串”hello“時結束輸入,不如分別判斷這五個字母,其次需要程式自動結束輸入,我們就需要用Console.Rea ...
  • 1.VirtrualBox安裝Centos6.8 minimal VirtrualBox新建個虛擬機配置好記憶體以及硬碟大小,安裝即可; 網路方式是 NAT(預設)和橋接方式來實現,最好在安裝前設置好,NAT主要是連外網,橋接可通過區域網IP訪問; 設置-網路-網卡1(NAT)預設已經設置好了,再點開 ...
  • 一年之前,我做夢也想不到會來這裡寫技術總結。誤打誤撞來到了上海西南某高校,成為了文科專業的工科男,現在每天除了膜ha,就是惡補CS。導師是做計算語言學的,所以當務之急就是先自學電腦自然語言處理,打好底子準備做科研(認真臉)。 進入正題,從圖書館找了本“Natural Language Proces ...
  • More is better Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 327680/102400 K (Java/Others)Total Submission(s): 24825 Accepted Submission(s): 89 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...