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
<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
<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、進程與線程:進程作為操作系