Spring框架04-AOP應用

Spring AOP 應⽤

AOP本質:在不改變原有業務邏輯的狀況下加強橫切邏輯,橫切邏輯代碼每每是權限校驗代碼、⽇志代碼、事務控制代碼、性能監控代碼java

AOP 相關術語

業務主線

在講解AOP術語以前,咱們先來看⼀下下⾯這兩張圖,它們是一個案例需求的擴展(針對這些擴展的需求,咱們只進⾏分析,在此基礎上去進⼀步回顧AOP,不進⾏實現)
image.pngspring

上圖描述的就是未採⽤AOP思想設計的程序,當咱們紅⾊框中圈定的⽅法時,會帶來⼤量的重複勞動。程序中充斥着⼤量的重複代碼,使咱們程序的獨⽴性不好。⽽下圖中是採⽤了AOP思想設計的程序,它    把紅框部分的代碼抽取出來的同時,運⽤動態代理技術,在運⾏期對須要使⽤的業務邏輯⽅法進⾏加強

image.png

AOP 術語

  • Joinpoint(鏈接點):它指的是那些能夠⽤於把加強代碼加⼊到業務主線中的點,那麼由上圖中咱們能夠看出,這些點指的就是⽅法。在⽅法執⾏的先後經過動態代理技術加⼊加強的代碼。在Spring框架AOP思想的技術實現中,也只⽀持⽅法類型的鏈接點
  • Pointcut(切⼊點):它指的是那些已經把加強代碼加⼊到業務主線進來以後的鏈接點。由上圖中,咱們看出表現層 transfer⽅法就只是鏈接點,由於判斷訪問權限的功能並無對其加強
  • Advice(通知加強):它指的是切⾯類中⽤於提供加強功能的⽅法。而且不一樣的⽅法加強的時機是不⼀樣的。⽐如,開啓事務確定要在業務⽅法執⾏以前執⾏;提交事務要在業務⽅法正常執⾏以後執⾏,⽽回滾事務要在業務⽅法執⾏產⽣異常以後執⾏等等。那麼這些就是通知的類型。其分類有:前置通知 後置通知 異常通知 最終通知 環繞通知
  • Target(⽬標對象):它指的是代理的⽬標對象。即被代理對象
  • Proxy(代理):它指的是⼀個類被AOP織⼊加強後,產⽣的代理類,即代理對象
  • Weaving(織⼊):它指的是把加強應⽤到⽬標對象來建立新的代理對象的過程。spring採⽤動態代理織⼊,⽽AspectJ採⽤編譯期織⼊和類裝載期織⼊
  • Aspect(切⾯):它指定是加強的代碼所關注的⽅⾯,把這些相關的加強代碼定義到⼀個類中,這個類就是切⾯類。例如,事務切⾯,它⾥⾯定義的⽅法就是和事務相關的,像開啓事務,提交事務,回滾事務等等,不會定義其餘與事務⽆關的⽅法。咱們前⾯的案例中 TrasnactionManager就是⼀個切⾯
鏈接點:⽅法開始時、結束時、正常運⾏完畢時、⽅法異常時等這些特殊的時機點,咱們稱之爲鏈接點,項⽬中每一個⽅法都有鏈接點,鏈接點是⼀種候選點
切⼊點:指定AOP思想一想要影響的具體⽅法是哪些,描述感興趣的⽅法

Advice加強

  • 第⼀個層次:指的是橫切邏輯
  • 第⼆個層次:⽅位點(在某⼀些鏈接點上加⼊橫切邏輯,那麼這些鏈接點就叫作⽅位點,描述的是具體的特殊時機)
Aspect切⾯

切⾯概念是對上述概念的⼀個綜合
Aspect切⾯ = 切⼊點+加強
= 切⼊點(鎖定⽅法)+ ⽅位點(鎖定⽅法中的特殊時機)+ 橫切邏輯框架

衆多的概念,⽬的就是爲了鎖定要在哪一個地⽅插⼊什麼橫切邏輯代碼性能

Spring中AOP的代理選擇

Spring 實現AOP思想使⽤的是動態代理技術ui

默認狀況下,Spring會根據被代理對象是否實現接⼝來選擇使⽤JDK動態代理仍是CGLIB。當被代理對象沒有實現任何接⼝時,Spring會選擇CGLIB。當被代理對象實現了接⼝,Spring會選擇JDK官⽅的代理技術,不過咱們能夠經過配置的⽅式,讓Spring強制使⽤CGLIB
DefaultAopProxyFactory.java源碼spa

public AopProxy createAopProxy(AdvisedSupport config) throws AopConfigException {
        //用JDK仍是CGlib
        if (config.isOptimize() || config.isProxyTargetClass() || hasNoUserSuppliedProxyInterfaces(config)) {
            Class<?> targetClass = config.getTargetClass();
            if (targetClass == null) {
                throw new AopConfigException("TargetSource cannot determine target class: " +
                        "Either an interface or a target is required for proxy creation.");
            }
            if (targetClass.isInterface() || Proxy.isProxyClass(targetClass)) {
                return new JdkDynamicAopProxy(config);
            }
            return new ObjenesisCglibAopProxy(config);
        }
        else {
            return new JdkDynamicAopProxy(config);
        }
    }

Spring中AOP的配置⽅式

在Spring的AOP配置中,也和IoC配置⼀樣,⽀持3類配置⽅式設計

  • 第⼀類:使⽤XML配置
  • 第⼆類:使⽤XML+註解組合配置
  • 第三類:使⽤純註解配置
相關文章
相關標籤/搜索