AOP本質:在不改變原有業務邏輯的狀況下加強橫切邏輯,橫切邏輯代碼每每是權限校驗代碼、⽇志代碼、事務控制代碼、性能監控代碼java
在講解AOP術語以前,咱們先來看⼀下下⾯這兩張圖,它們是一個案例需求的擴展(針對這些擴展的需求,咱們只進⾏分析,在此基礎上去進⼀步回顧AOP,不進⾏實現)
spring
上圖描述的就是未採⽤AOP思想設計的程序,當咱們紅⾊框中圈定的⽅法時,會帶來⼤量的重複勞動。程序中充斥着⼤量的重複代碼,使咱們程序的獨⽴性不好。⽽下圖中是採⽤了AOP思想設計的程序,它 把紅框部分的代碼抽取出來的同時,運⽤動態代理技術,在運⾏期對須要使⽤的業務邏輯⽅法進⾏加強
鏈接點:⽅法開始時、結束時、正常運⾏完畢時、⽅法異常時等這些特殊的時機點,咱們稱之爲鏈接點,項⽬中每一個⽅法都有鏈接點,鏈接點是⼀種候選點
切⼊點:指定AOP思想一想要影響的具體⽅法是哪些,描述感興趣的⽅法
切⾯概念是對上述概念的⼀個綜合
Aspect切⾯ = 切⼊點+加強
= 切⼊點(鎖定⽅法)+ ⽅位點(鎖定⽅法中的特殊時機)+ 橫切邏輯框架
衆多的概念,⽬的就是爲了鎖定要在哪一個地⽅插⼊什麼橫切邏輯代碼
性能
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配置中,也和IoC配置⼀樣,⽀持3類配置⽅式設計