欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入理解spring的AOP機制原理

 更新時間:2017年09月08日 10:36:39   作者:haofengpingjieli  
本篇文章主要介紹了深入理解spring的AOP機制原理,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言

在軟件開發(fā)中,散布于應用中多處的功能被稱為橫切關注點,通常來講,這些橫切關注點從概念上是與應用的業(yè)務邏輯相分離的。把這些橫切關注點和業(yè)務邏輯分離出來正是AOP要解決的問題。AOP能夠幫我們模塊化橫切關注點,換言之,橫切關注點可以被描述為影響應用多出的功能。這些橫切點被模塊化特殊的類,這些類被稱為切面。

術語定義

通知:切面有必須要完成的工作,在AOP中,切面的工作被稱為通知。通知定義了切面是什么以及何時使用,除了描述切面要完成的工作,通知還解決了何時執(zhí)行這個工作的問題,它應該在某個方法之前?之后?之前和之后都調(diào)用?還是只在方法拋出異常時調(diào)用?

連接點:連接點是應用程序執(zhí)行過程中,能夠插入切面的一個點。

切點:是在連接點的基礎上定義切點,比方說一個類由十幾個方法,每個方法的調(diào)用前和調(diào)用后都可以插入通知,但是你只想選擇幾個方法插入通知,因此你定義一個切點來選擇你想插入的通知的方法。

切面:切面就是通知和切點的結合。

織入:織入是把切面應用到目標對象并創(chuàng)建新的代理對象的過程,切面在指定的連接點被織入到目標對象中。在目標對象的生命周期里有多個點可以進行織入:編譯期、類加載期、運行期。其中編譯器織入需要特殊的編譯器,類加載器織入需要特殊的類加載器,spring的AOP 是在運行期織入通知的。

Spring的AOP支持

spring提供了AOP的四種支持,分別是:基于代理的經(jīng)典Spring AOP模式;純POJO切面;@AspectJ注解驅(qū)動的切面;@注入式AspectJ切面。spring所創(chuàng)建的通知都是用標準的Java類編寫的,而且定義通知所應用的切點通常會使用注解或在Spring配置文件里采用XML來編寫。

spring只支持方法級別的連接點。

在spring AOP中,要使用AspectJ的切點表達式語言來定義切點,關于Spring AOP的AspectJ切點,最重要的一點就是Spring僅支持AspectJ切點指示器的一個子集:

1.arg() 限制連接點匹配參數(shù)為指定類型的執(zhí)行方法;
2.@args() 限制連接點匹配參數(shù)由指定注解標注的執(zhí)行方法;
3.execution() 用于匹配是連接點的執(zhí)行方法;
4.this() 限制連接點匹配AOP代理的bean引用為指定類型的類
5.target 限制連接點匹配目標對象為指定類型的類
6.@target() 限制連接點匹配特定的執(zhí)行對象,這些對象對應的類要具有指定類型的注解
7.within() 限制連接點匹配指定的類型
8.@within() 限制連接點匹配特定注解所標注的類型
9.@annotation 限定匹配帶有指定注解的連接點

spring 注解創(chuàng)建切面

目標對象:

package concert;
public interface Performance{
  public void perform();
}

切面對象:

package concert;

@Aspect//表示Audience的實例是一個切面
public class Audience{
  @Before("execution(**concert.Performance.perform(..))")
  public void silenceCellPhones(){
  //在perfrom方法執(zhí)行之前
  }
  @Before("execution(**concert.Performance.perform(..))")
  public void takeSeats(){
  //在perfrom方法執(zhí)行之前
  }
  @AfterReturning("execution(**concert.Performance.perform(..))")
  public void silenceCellPhones(){
  //在perfrom方法執(zhí)行之后
  }
  @AfterThrowing("execution(**concert.Performance.perform(..))")
  public void silenceCellPhones(){
  //在perfrom方法拋出異常之后
  }
}

上面的類中切點表達式execution(**concert.Performance.perform(..))多次出現(xiàn),我們也可以通過@Pointcut注解避免每次都寫很長的切點表但是如下所示:

@Aspect//表示Audience的實例是一個切面
public class Audience{
  @Pointcut("execution(**concert.Performance.perform(..))")
  public void performance(){}
  @Before("performance()")
  public void silenceCellPhones(){
  //在perfrom方法執(zhí)行之前
  }
  @Before("performance()")
  public void takeSeats(){
  //在perfrom方法執(zhí)行之前
  }
  @AfterReturning("performance()")
  public void silenceCellPhones(){
  //在perfrom方法執(zhí)行之后
  }
  @AfterThrowing("performance()")
  public void silenceCellPhones(){
  //在perfrom方法拋出異常之后
  }
}

接下來需要在配置文件中配置切面如下所示:

@Configuration
@EnableAspectJAutoProxy//啟動AspectJ自動代理
@ComponentScan
public class ConcertConfig{
}
//或者在配置文件中配置中添加
<aop:aspectj-autoproxy />

表示啟動切面代理

環(huán)繞通知:

@Aspect//表示Audience的實例是一個切面
public class Audience{
  @Pointcut("execution(**concert.Performance.perform(..))")
  public void performance(){}
  
  @Before("performance()")
  public void watchPerformance(ProceedingJoinPoint jp){
    //在方法之前執(zhí)行
    System.out.println(" beform the method is invoked");
    jp.proceed()//控制權交給目標方法
    //在方法之后執(zhí)行
    System.out.println(" after the method is invoked");
  }
  
}

處理通知中的參數(shù)

public class Audience{
  @Pointcut("execution(**concert.Performance.perform(int))&&args(trackNumber)")
  public void performance(){}
  
  @Before("performance(trackNumber)")
  public void watchPerformance(int trackNumber){
    //截獲傳遞給目標方法的參數(shù)并傳遞給切面中處理方法
    System.out.println(trackNumber);
  }
  
}

xml中聲明切面

spring AOP提供的xml配置元素:

1.<aop:advisor> 定義AOP通知;
2.<aop:after> 后置通知;
3.<aop:after-returning> 返回通知
4.<aop:around> 環(huán)繞通知
5.<aop:aspect> 定義一個切面
6.<aop:aspectj-autoproxy> 啟用切面注解驅(qū)動
7.<aop:before> 前置通知
8.<aop:config> 頂層的AOP配置元素;
9.<aop:pointcut>:定義個切點

<aop:config>
  <aop:aspect ref="audience">
    <aop:before
     pointcut="execution(**concert.Performance.perform())" method="silenceCellPhones"/>
     <aop:before
     pointcut="execution(**concert.Performance.perform())" method="takeSeats"/>
     <aop:after-returning
     pointcut="execution(**concert.Performance.perform())" method="applause"/>
     <aop:after-throwing
     pointcut="execution(**concert.Performance.perform())" method="demandRefund"/>

  </aop:aspect>
</aop config>

定義切點:

<aop:config>
  <aop:aspect ref="audience">
    <aop:pointcut id="performance" expression="execution(**concert.Performance.perform())">
    <aop:before
     pointcut-ref="performance" method="silenceCellPhones"/>
     <aop:before
     pointcut="performance" method="takeSeats"/>
     <aop:after-returning
     pointcut="performance" method="applause"/>
     <aop:after-throwing
     pointcut="performance" method="demandRefund"/>

  </aop:aspect>
</aop config>

以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • spring循環(huán)依賴策略解析

    spring循環(huán)依賴策略解析

    這篇文章主要為大家詳細介紹了spring循環(huán)依賴策略,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2017-09-09
  • 關于feign.codec.DecodeException異常的解決方案

    關于feign.codec.DecodeException異常的解決方案

    這篇文章主要介紹了關于feign.codec.DecodeException異常的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringBoot集成FTP與SFTP連接池流程

    SpringBoot集成FTP與SFTP連接池流程

    在項目開發(fā)中,一般文件存儲很少再使用SFTP服務,但是也不排除合作伙伴使用SFTP來存儲項目中的文件或者通過SFTP來實現(xiàn)文件數(shù)據(jù)的交互,這篇文章主要介紹了SpringBoot集成FTP與SFTP連接池
    2022-12-12
  • java8中的lambda表達式簡介

    java8中的lambda表達式簡介

    Lambda表達式類似匿名函數(shù),簡單地說,它是沒有聲明的方法,也即沒有訪問修飾符、返回值聲明和方法名,這篇文章主要介紹了java8?中的lambda表達式簡介,需要的朋友可以參考下
    2022-06-06
  • Java中初始化List集合的八種方式匯總

    Java中初始化List集合的八種方式匯總

    List?是?Java?開發(fā)中經(jīng)常會使用的集合,下面這篇文章主要給大家介紹了關于Java中初始化List集合的八種方式,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2022-06-06
  • java連接數(shù)據(jù)庫增、刪、改、查工具類

    java連接數(shù)據(jù)庫增、刪、改、查工具類

    這篇文章主要介紹了java連接數(shù)據(jù)庫增、刪、改、查工具類,需要的朋友可以參考下
    2014-05-05
  • Java中enum枚舉類型的基本特性詳解

    Java中enum枚舉類型的基本特性詳解

    這篇文章主要介紹了Java中enum枚舉類型的基本特性詳解,enum關鍵字用于創(chuàng)建一個新類型,其中包含一組數(shù)量有限的命名變量,并視這些變量為常規(guī)程序組件,實踐表明這是一種非常有用的類型,需要的朋友可以參考下
    2023-11-11
  • SpringMVC DispatcherServlet組件實現(xiàn)解析

    SpringMVC DispatcherServlet組件實現(xiàn)解析

    這篇文章主要介紹了SpringMVC DispatcherServlet組件實現(xiàn)解析,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03
  • SpringBoot使用SensitiveWord實現(xiàn)敏感詞過濾

    SpringBoot使用SensitiveWord實現(xiàn)敏感詞過濾

    這篇文章主要為大家詳細介紹了SpringBoot如何使用SensitiveWord實現(xiàn)敏感詞過濾功能,文中示例代碼講解詳細,感興趣的小伙伴可以了解一下
    2023-01-01
  • Java Buffer緩沖區(qū)(NIO)

    Java Buffer緩沖區(qū)(NIO)

    Java NIO(New IO)是從Java 1.4版本開始引入的一個新的IO API,可以替代標準的Java IO API。本系列教程將有助于你學習和理解Java NIO。
    2021-09-09

最新評論