1. 程式人生 > >spring的aop底層的實現方式

spring的aop底層的實現方式

AOP作用:

日誌的記錄

許可權的校驗

效能的檢測(檢視某個方法執行了多長時間)

事務的管理

AOP這種思想是由AOP聯盟組織提出來的一種思想,spring是把這種思想實現的最好的框架之一

Aop的兩種實現方式:

Jdk的動態代理只能對有介面的實現進行增強

Cglib的動態代理:可以對類進行增強,這個類不需要實現任何介面

第一步建立maven工程,解決兩個問題

第二步:匯入jar

<dependencies>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-context</artifactId>

<version>4.2.4.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-core -->

<dependency>

<groupId>org.springframework

</groupId>

<artifactId>spring-core</artifactId>

<version>4.2.4.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-beans -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-beans

</artifactId>

<version>4.2.4.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-expression -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-expression</artifactId>

<version>4.2.4.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-web -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-web</artifactId>

<version>4.2.4.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->

<dependency>

<groupId>javax.servlet</groupId>

<artifactId>javax.servlet-api</artifactId>

<version>3.1.0</version>

<scope>provided</scope>

</dependency>

<!-- https://mvnrepository.com/artifact/junit/junit -->

<dependency>

<groupId>junit</groupId>

<artifactId>junit</artifactId>

<version>4.11</version>

<scope>test</scope>

</dependency>

<!-- spring的註解開發必須要依賴的jar-->

<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-aop</artifactId>

<version>4.2.4.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-test -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-test</artifactId>

<version>4.2.4.RELEASE</version>

<scope>test</scope>

</dependency>

<!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->

<dependency>

<groupId>aopalliance</groupId>

<artifactId>aopalliance</artifactId>

<version>1.0</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.aspectj/aspectjweaver -->

<dependency>

<groupId>org.aspectj</groupId>

<artifactId>aspectjweaver</artifactId>

<version>1.6.8</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-aop -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-aop</artifactId>

<version>4.2.4.RELEASE</version>

</dependency>

<!-- https://mvnrepository.com/artifact/org.springframework/spring-aspects -->

<dependency>

<groupId>org.springframework</groupId>

<artifactId>spring-aspects</artifactId>

<version>4.2.4.RELEASE</version>

</dependency>

</dependencies>

<build>

<plugins>

<plugin>

<groupId>org.apache.maven.plugins</groupId>

<artifactId>maven-compiler-plugin</artifactId>

<version>3.1</version>

<configuration>

<source>1.8</source>

<target>1.8</target>

<encoding>utf-8</encoding>

</configuration>

</plugin>

</plugins>

</build>

第一種方式:通過jdk的動態代理實現增強的功能

定義介面與實現

定義我們的增強類

實現我們的代理類

public class PersonProxy implements InvocationHandler{

private  PersonDao personDao;

public  PersonProxy(PersonDao personDao){

this.personDao = personDao;

}

public  PersonDao createPersonDaoProxy(){

/**

 * 第一個引數:類載入器

 * 第二個引數:所有實現的介面

 * 第三個引數:invocationHandler

 *

 */

PersonDao newProxyInstance = (PersonDao) Proxy.newProxyInstance(personDao.getClass().getClassLoader(), personDao.getClass().getInterfaces(), this);

return newProxyInstance;

}

/**

 * 實現了invocationHandler介面之後就必須要實現一個方法,叫做invoke方法

 */

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

if(method.getName().equals("add")){

PersonStrong strong = new PersonStrong();

strong.checkPrivilege();

return  method.invoke(personDao, args);

}

return  method.invoke(personDao, args);

}

}

測試用例

/**

 *

 * @throws Exception

 */

@Test

publicvoid getJdkProxy() throws Exception {

//介面指向實現類,多型

PersonDao dao = new  PersonDaoImpl();

PersonProxyproxy = newPersonProxy(dao);

PersonDao createPersonDaoProxy = proxy.createPersonDaoProxy();

createPersonDaoProxy.add();

}


相關推薦

session會話的底層實現方式

 Session的底層實現方式:在伺服器的記憶體當中會為每一個客戶端的瀏覽器建立一個ID,這個物件是唯一的,它對應著儲存在伺服器記憶體中的一個session物件(為當前瀏覽器所建立的物件),通過ID可以找到這個物件,通過這個物件可以找到session物件中所儲存的key和va

Python裏面幾種排序算法的比較,sorted的底層實現,雖然我們知道sorted的實現方式,但是

增長 歸並排序 sha __main__ 代碼 復雜 位置 好的 strong 算法與數據結構基礎 原文鏈接:http://note.youdao.com/noteshare?id=7b9757930ce3cc9e0a5e61e4d0aa9ea2&sub=2726FFA02

jdk動態代理與cglib程式碼實現--SpringAop底層原理

動態代理分為兩類:基於介面的代理和基於繼承的代理 兩類實現的代表是:JDK代理 與 CGlib代理 cglib實現動態代理: 1、定義目標物件: public class RealSubject { //目標物件RealSubject,cglib不

spring的aop底層實現方式

AOP的作用: 日誌的記錄 許可權的校驗 效能的檢測(檢視某個方法執行了多長時間) 事務的管理 AOP這種思想是由AOP聯盟組織提出來的一種思想,spring是把這種思想實現的最好的框架之一 Aop的兩種實現方式: Jdk的動態代理:只能對有介面的實現類進行增強 Cgl

springAOP的三種實現方式

#### springAOP的實現方式 三種 純XML方式,XML+註解,純註解方式。 Spring 實現AOP思想使⽤的是動態代理技術 預設情況下, Spring會根據被代理物件是否實現接⼝來選擇使⽤JDK還是CGLIB。當被代理物件沒有實現 任何接⼝時, Spring會選擇CGLIB。當被代理物件實

同一功能三種不同實現方式你選哪個

img com png 指令 con 段落 gin 表示 alt 例題一枚:在input框中輸入內容,會相應的顯示在下面的div中的不同做法: <!DOCTYPE html> <html> <head> &

異步實現方式

his filled ice reac throw fin proto prototype amp Promise異步實現方式: var promise = new Promise(function (resolve, reject) { setTimeout(f

web 動畫實現方式

中間 fun for || wid over abs cit 播放 這這裏,總結了一些 我知道的不用框架來實現動畫的方式,總的來說有兩種,第一種是用css的transition或keyframes+animation,第二種用js來實現 首先看基本結構 <style

線程的實現方式之內核支持線程和用戶級線程

自己 資源 images 分類 由於 內核對象 方法 使用 use   線程是OS進行獨立調試、執行的基本單位,進程是系統進行資源分配的基本單位,一個進程可以包含若幹個線程。無論是系統進程還是用戶進程,進程的創建、撤消、以及要求系統設備完成的IO操作,都是利用系統調用而進入

sql乘法函數實現方式

ont tab img src 乘法 weight 計算 例如 eight sql中有很多聚合函數,例如 COUNT、SUM、MIN 和 MAX。 但是唯獨沒有乘法函數,而很多朋友開發中缺需要用到這種函數,今天告訴大家一個不錯的解決方案 logx+logy=logx*y

libevent 信號事件實現方式

意思 isp turn cte ret argc lec print tail 學會使用libevent,才能真正的掌握其是實現原理,我們先從一個簡短的測試用例開始: 1 #include <sys/types.h> 2 #include <sy

iOS開發各種底層實現--面試必備!

task 源碼 控件 改變 消息發送 釋放內存 retain select 匹配 iOS開發常用技術底層實現(精簡概述) 本章將對ios開發技術底層實現的總結,其實關於ios開發中各種底層的實現,網上相關文章多到數不過來,而不且非常不錯,我也沒有自信我能比他們做的更好,因

Jenkins 關閉和重啟實現方式

只需要 rest spa str 配置 color 地址 信息 方式 1、關閉Jenkins 只需要在訪問jenkins服務器的網址url地址後加上exit。例如我jenkins的地址http://localhost:8080/,那麽我只需要在瀏覽器地址欄上敲下h

單例模式的5種實現方式

ber none jvm hid dem abs spl null uic 1.餓漢模式(線程安全,調用效率高,但是不能延時加載): package com.yanwu.www.demo; /* * 測試單例模式 * * 餓漢模式 * * @author

《開源框架那點事兒25》:對框架模板引擎實現方式的改造實錄

port 內嵌 代碼調試 iter put 文件路徑 children nts fault 點滴悟透設計思想,Tiny模板引擎優化實錄! 增加框架設計興趣小組:http://bbs.tinygroup.org/group-113-1.html Tiny模板引擎的實

【轉】C# 高性能 TCP 服務的多種實現方式

http c# del sha 開源 https tar .com targe 原文鏈接: http://www.cnblogs.com/gaochundong/p/csharp_tcp_service_models.html 開源庫: https://g

[轉]Web APi之認證(Authentication)兩種實現方式【二】(十三)

用戶數 ted das 客戶 元素 基礎 目標 開始 net 本文轉自:http://www.cnblogs.com/CreateMyself/p/4857799.html 前言 上一節我們詳細講解了認證及其基本信息,這一節我們通過兩種不同方式來實現認證,並且分析如

prototype和new的底層實現

bject span console prot pan var col tor 包含 <script type="text/javascript"> function A(){ this.name = "jack

Asp.Net.Identity認證不依賴Entity Framework實現方式

aps 新建 create exc spn sharp 個數 blank aspnet Asp.Net.Identity為何物請自行搜索,也可轉向此文章http://www.cnblogs.com/shanyou/p/3918178.html 本來微軟已經幫我們將授權、認證

《C#多線程編程實現方式

所有 cal 優先級 lin threading 內核對象 gin 執行 多個 一、使用線程的理由 1、可以使用線程將代碼同其他代碼隔離,提高應用程序的可靠性。 2、可以使用線程來簡化編碼。 3、可以使用線程來實現並發執行。 二、基本知識 1、進程與線程:進程作為操作系