spring是一個技術體系,以前說過spring的ioc,學習底層的意義,爲的是之後靈活進行定製的時候,學的底層知識就能夠用了。以前我記得在開發的時候,log日誌都是debug,到線上的時候爲了避免影響性能就改爲info,可是若是是線上出問題了,須要關閉項目更改成debug,查看究竟是怎麼回事,其實若是學習了aop,裏面有個開關的功能,能夠動態的不更改項目狀態的狀況下,動態的讓日誌級別發生改變,靈活的追蹤項目裏面的存在的問題。java
AOP
-
定義正則表達式
當須要批量的定義程序邏輯,批量更改程序的時候,其實裏面有不少坑,會讓程序自己很複雜。有些人喜歡在AOP裏面增長緩存,帶來便利的同時也帶來了複雜性。當代碼變的擴展性強的時候,複雜性也變的很是強了。尤爲是新手,慎重選擇,尤爲是負責性和擴展性上,作好真別。別讓方案過於複雜。要用簡單的方案實現複雜的問題,而不是是複雜的方案實現簡單的問題。開發多年的領悟。spring
-
通知攔截組件緩存
切入的具體邏輯載體。架構
-
aop 定義組件框架
描述了aop具體包括哪些通知,具體切入到哪些方法。ide
-
調用執行組件模塊化
目標對象代理實現。性能
- java proxy
- cglib proxy
- 其餘
- AopProxyBeanFactory
- AopProxy
流程梳理:首先會寫一個aop攔截的邏輯組件,到底要攔截什麼,具體的業務是什麼,由AOP定義組件告訴我具體有哪些通知和攔截的組件,把它插入到哪些方法裏面。具體的哪些方法執行是經過調用執行組件。由其餘裏面的aopbeanfactroy生成對應的aopproxy,用戶拿到的就是業務服務類,達到的目的就是透明化。透明化的含義就是對用戶來講調用者來講不須要關心這些,經過代理的方式把中間的方式不展現給用戶來,就是透明化。AOP說實在的要不IOC複雜的不少。學習
AOP胡概念
-
鏈接點(Jointpoint):表示須要在程序中插入橫切關注點的擴展點,鏈接點多是類初始化、方法執行、方法調用、字段調用或處理異常等等,Spring只支持方法執行鏈接點,在AOP中表示爲「在哪裏幹」;
-
切入點(Pointcut):選擇一組相關鏈接點的模式,便可以認爲鏈接點的集合,Spring支持perl5正則表達式和AspectJ切入點模式,Spring默認使用AspectJ語法,在AOP中表示爲「在哪裏乾的集合」;
-
通知(Advice):在鏈接點上執行的行爲,通知提供了在AOP中須要在切入點所選擇的鏈接點處進行擴展示有行爲的手段;包括前置通知(before advice)、後置通知(after advice)、環繞通知(around advice),在Spring中經過代理模式實現AOP,並經過攔截器模式以環繞鏈接點的攔截器鏈織入通知;在AOP中表示爲「幹什麼」;
-
方面/切面(Aspect):橫切關注點的模塊化,好比上邊提到的日誌組件。能夠認爲是通知、引入和切入點的組合;在Spring中能夠使用Schema和@AspectJ方式進行組織實現;在AOP中表示爲「在哪乾和幹什麼集合」;
-
引入(inter-type declaration):也稱爲內部類型聲明,爲已有的類添加額外新的字段或方法,Spring容許引入新的接口(必須對應一個實現)到全部被代理對象(目標對象), 在AOP中表示爲「幹什麼(引入什麼)」;
-
目標對象(Target Object):須要被織入橫切關注點的對象,即該對象是切入點選擇的對象,須要被通知的對象,從而也可稱爲「被通知對象」;因爲Spring AOP 經過代理模式實現,從而這個對象永遠是被代理對象,在AOP中表示爲「對誰幹」;
-
AOP代理(AOP Proxy):AOP框架使用代理模式建立的對象,從而實如今鏈接點處插入通知(即應用切面),就是經過代理來對目標對象應用切面。在Spring中,AOP代理能夠用JDK動態代理或CGLIB代理實現,而經過攔截器模型應用切面。
- 織入(Weaving):織入是一個過程,是將切面應用到目標對象從而建立出AOP代理對象的過程,織入能夠在編譯期、類裝載期、運行期進行。
在AOP中,經過切入點選擇目標對象的鏈接點,而後在目標對象的相應鏈接點處織入通知,而切入點和通知就是切面(橫切關注點),而在目標對象鏈接點處應用切面的實現方式是經過AOP代理對象。
PS:AOP目前我用到的幾個場景,就是日誌管理,事務控制,權限管理 等幾個。