一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - 詳解Spring Aop實例之AspectJ注解配置

詳解Spring Aop實例之AspectJ注解配置

2020-09-06 15:15龍軒 Java教程

本篇文章主要介紹了詳解Spring Aop實例之AspectJ注解配置,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

上篇《spring aop實例之xml配置》中,講解了xml配置方式,今天來說說aspectj注解方式去配置spring aop。

依舊采用的jdk代理,接口和實現類代碼請參考上篇博文。主要是將aspect類分享一下:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package com.tgb.aop;
 
import org.aspectj.lang.joinpoint;
import org.aspectj.lang.proceedingjoinpoint;
import org.aspectj.lang.annotation.after;
import org.aspectj.lang.annotation.afterreturning;
import org.aspectj.lang.annotation.afterthrowing;
import org.aspectj.lang.annotation.around;
import org.aspectj.lang.annotation.aspect;
import org.aspectj.lang.annotation.before;
import org.aspectj.lang.annotation.declareparents;
import org.aspectj.lang.annotation.pointcut;
 
/**
 * 測試after,before,around,throwing,returning advice.
 * @author admin
 *
 */
@aspect
public class aspcejadvice {
 
 /**
  * pointcut
  * 定義pointcut,pointcut的名稱為aspectjmethod(),此方法沒有返回值和參數
  * 該方法就是一個標識,不進行調用
  */
 @pointcut("execution(* find*(..))")
 private void aspectjmethod(){};
  
 /**
  * before
  * 在核心業務執行前執行,不能阻止核心業務的調用。
  * @param joinpoint
  */
 @before("aspectjmethod()")
 public void beforeadvice(joinpoint joinpoint) {
  system.out.println("-----beforeadvice().invoke-----");
  system.out.println(" 此處意在執行核心業務邏輯前,做一些安全性的判斷等等");
  system.out.println(" 可通過joinpoint來獲取所需要的內容");
  system.out.println("-----end of beforeadvice()------");
 }
  
 /**
  * after
  * 核心業務邏輯退出后(包括正常執行結束和異常退出),執行此advice
  * @param joinpoint
  */
 @after(value = "aspectjmethod()")
 public void afteradvice(joinpoint joinpoint) {
  system.out.println("-----afteradvice().invoke-----");
  system.out.println(" 此處意在執行核心業務邏輯之后,做一些日志記錄操作等等");
  system.out.println(" 可通過joinpoint來獲取所需要的內容");
  system.out.println("-----end of afteradvice()------");
 }
 
 /**
  * around
  * 手動控制調用核心業務邏輯,以及調用前和調用后的處理,
  *
  * 注意:當核心業務拋異常后,立即退出,轉向afteradvice
  * 執行完afteradvice,再轉到throwingadvice
  * @param pjp
  * @return
  * @throws throwable
  */
 @around(value = "aspectjmethod()")
 public object aroundadvice(proceedingjoinpoint pjp) throws throwable {
  system.out.println("-----aroundadvice().invoke-----");
  system.out.println(" 此處可以做類似于before advice的事情");
   
  //調用核心邏輯
  object retval = pjp.proceed();
  system.out.println(" 此處可以做類似于after advice的事情");
  system.out.println("-----end of aroundadvice()------");
  return retval;
 }
  
 /**
  * afterreturning
  * 核心業務邏輯調用正常退出后,不管是否有返回值,正常退出后,均執行此advice
  * @param joinpoint
  */
 @afterreturning(value = "aspectjmethod()", returning = "retval")
 public void afterreturningadvice(joinpoint joinpoint, string retval) {
  system.out.println("-----afterreturningadvice().invoke-----");
  system.out.println("return value: " + retval);
  system.out.println(" 此處可以對返回值做進一步處理");
  system.out.println(" 可通過joinpoint來獲取所需要的內容");
  system.out.println("-----end of afterreturningadvice()------");
 }
  
 /**
  * 核心業務邏輯調用異常退出后,執行此advice,處理錯誤信息
  *
  * 注意:執行順序在around advice之后
  * @param joinpoint
  * @param ex
  */
 @afterthrowing(value = "aspectjmethod()", throwing = "ex")
 public void afterthrowingadvice(joinpoint joinpoint, exception ex) {
  system.out.println("-----afterthrowingadvice().invoke-----");
  system.out.println(" 錯誤信息:"+ex.getmessage());
  system.out.println(" 此處意在執行核心業務邏輯出錯時,捕獲異常,并可做一些日志記錄操作等等");
  system.out.println(" 可通過joinpoint來獲取所需要的內容");
  system.out.println("-----end of afterthrowingadvice()------");
 }
}

application-config.xml中,只需要配置業務邏輯bean和aspect bean,并啟用aspect注解即可:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
 
<beans xmlns="http://www.springframework.org/schema/beans"
   xmlns:xsi="http://www.w3.org/2001/xmlschema-instance"
   xmlns:aop="http://www.springframework.org/schema/aop"
   xmlns:tx="http://www.springframework.org/schema/tx"
   xsi:schemalocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">
    
 <!-- 啟用aspectj對annotation的支持 -->  
 <aop:aspectj-autoproxy/>   
  
 <bean id="usermanager" class="com.tgb.aop.usermanagerimpl"/>
 <bean id="aspcejhandler" class="com.tgb.aop.aspcejadvice"/>
  
</beans>

 結果如圖:

詳解Spring Aop實例之AspectJ注解配置

詳解Spring Aop實例之AspectJ注解配置

通過測試的發現aroundadvice、beforeadvice、afteradvice、returningadvice的執行順序是根據注解的順序而定的。但是有時候修改了順序,結果卻沒有變化,可能是緩存的緣故。前幾天我也遇到了這樣的問題,不過今天再測試了一下,發現執行順序又跟注解的順序一致了。

 xml 和 annotation 注解都可以作為配置項,對spring aop進行配置管理,那么它們各自都有什么優缺點呢?

首先說說 xml 。目前 web 應用中幾乎都使用 xml 作為配置項,例如我們常用的框架 struts、spring、hibernate 等等都采用 xml 作為配置。xml 之所以這么流行,是因為它的很多優點是其它技術的配置所無法替代的:

  1. xml 作為可擴展標記語言最大的優勢在于開發者能夠為軟件量身定制適用的標記,使代碼更加通俗易懂。
  2. 利用 xml 配置能使軟件更具擴展性。例如 spring 將 class 間的依賴配置在 xml 中,最大限度地提升應用的可擴展性。
  3. 具有成熟的驗證機制確保程序正確性。利用 schema 或 dtd 可以對 xml 的正確性進行驗證,避免了非法的配置導致應用程序出錯。
  4. 修改配置而無需變動現有程序。

雖然有如此多的好處,但畢竟沒有什么萬能的東西,xml 也有自身的缺點。

  1. 需要解析工具或類庫的支持。
  2. 解析 xml 勢必會影響應用程序性能,占用系統資源。
  3. 配置文件過多導致管理變得困難。
  4. 編譯期無法對其配置項的正確性進行驗證,或要查錯只能在運行期。
  5. ide 無法驗證配置項的正確性無能為力。
  6. 查錯變得困難。往往配置的一個手誤導致莫名其妙的錯誤。
  7. 開發人員不得不同時維護代碼和配置文件,開發效率變得低下。
  8. 配置項與代碼間存在潛規則。改變了任何一方都有可能影響另外一方。

讓我們來看看 annotation 的優點。

  1. 保存在 class 文件中,降低維護成本。
  2. 無需工具支持,無需解析。
  3. 編譯期即可驗證正確性,查錯變得容易。
  4. 提升開發效率。

同樣 annotation 也不是萬能的,它也有很多缺點。

  1. 若要對配置項進行修改,不得不修改 java 文件,重新編譯打包應用。
  2. 配置項編碼在 java 文件中,可擴展性差。

總結:沒有一個事物是萬能的,同樣 xml 和 java annotation 都有各自的優缺點。通過以上對比,細心的讀者可能已經發現它們的優缺點恰恰是互補的。xml 的強項是 annotation 所不具備的,而 annotation 的優勢也是 xml 所欠缺的。這也正是時下流行的 xml + annotation 配置的原因所在。平衡才是王道呀!

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持服務器之家。

原文鏈接:http://blog.csdn.net/xiaoxian8023/article/details/17285809

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 国产精品成人在线播放 | 五月婷婷在线观看 | 国产欧美日韩一区二区三区在线 | 久久久久久久99精品免费观看 | 小仙夜晚慰自催眠mp3护士篇 | 亚洲欧美在线免费观看 | 国产90后美女露脸在线观看 | 国产精品自拍一区 | 国产一级真人毛爱做毛片 | 亚洲青草视频 | 婷婷久久综合九色综合九七 | 三级理论在线播放大全 | 国产一级特黄在线播放 | 爱爱一级视频 | 亚洲无线一二三区2021 | 国产精品天天看天天爽 | 亚欧洲乱码专区视频 | 久久久免费热线精品频 | 99国产精品免费观看视频 | 激情婷婷综合久久久久 | 美艳教师刘艳第三部166 | 女仆色永久免费网站 | 亚洲国产日韩欧美一区二区三区 | 99在线免费播放 | 果冻传媒林予曦图片 | 国产视频久久久久 | 无码精品AV久久久奶水 | 苍井空av| 国产成人无精品久久久久国语 | 成年男女免费大片在线观看 | 日本xxxxxx片免费播放18 | 亚洲成人77777 | 毛片视频网站在线观看 | 精品国产精品人妻久久无码五月天 | 欧美日韩精品一区二区三区高清视频 | 99在线精品免费视频九九视 | 日韩欧美国产成人 | 天天综合色天天综合网 | 全黄h全肉细节修仙玄幻文 全彩调教侵犯h本子全彩妖气he | xxx88视频在线观看 | aa视频免费|