Spring AOP目前僅支持方法執行鏈接點(建議在Spring bean上執行方法)。雖然能夠在不破壞核心Spring AOP API的狀況下添加對字段攔截的支持,但未實現字段攔截。若是您須要建議字段訪問和更新鏈接點,請考慮使用AspectJ等語言。Spring AOP的AOP方法與大多數其餘AOP框架的方法不一樣。目的不是提供最完整的AOP實現(儘管Spring AOP很是強大)。相反,目標是在AOP實現和Spring IoC之間提供緊密集成,以幫助解決企業應用程序中的常見問題。所以,例如,Spring Framework的AOP功能一般與Spring IoC容器一塊兒使用。經過使用普通bean定義語法來配置方面(儘管這容許強大的「自動代理」功能)。這是與其餘AOP實現的重要區別。使用Spring AOP沒法輕鬆或高效地完成某些操做,例如建議很是細粒度的對象(一般是域對象)。在這種狀況下,AspectJ是最佳選擇。可是,咱們的經驗是Spring AOP爲適合AOP的企業Java應用程序中的大多數問題提供了出色的解決方案。框架
1.AOP的做用工具
在OOP中,正是這種分散在各處且與對象核心功能無關的代碼(橫切代碼)的存在,使得模塊複用難度增長。AOP則將封裝好的對象剖開,找出其中對多個對象產生影響的公共行爲,並將其封裝爲一個可重用的模塊,這個模塊被命名爲「切面」(Aspect),切面將那些與業務無關,卻被業務模塊共同調用的邏輯提取並封裝起來,減小了系統中的重複代碼,下降了模塊間的耦合度,同時提升了系統的可維護性。spa
2.DI 和 IOC 概念代理
依賴注入或控制反轉的定義中,調用者不負責被調用者的實例建立工做,該工做由Spring框架中的容器來負責,它經過開發者的配置來判斷實例類型,建立後再注入調用者。因爲Spring容器負責被調用者實例,實例建立後又負責將該實例注入調用者,所以稱爲依賴注入。而被調用者的實例建立工做再也不由調用者來建立而是由Spring來建立,控制權由應用代碼轉移到了外部容器,控制權發生了反轉,所以稱爲控制反轉。對象
3.BeanFactory與ApplicationContext接口
ApplicationContext是BeanFactory的子接口,也被稱爲應用上下文。BeanFactory提供了Spring的配置框架和基本功能,ApplicationContext則添加了更多企業級功能(如國際化的支持),他另外一重要優點在於當ApplicationContext容器初始化完成後,容器中全部的 singleton Bean 也都被實例化了,也就是說當你須要使用singleton Bean 是,在應用中無需等待就能夠用,而其餘BeanFactory接口的實現類,則會延遲到調用 getBean()方法時構造,ApplicationContext的初始化時間會稍長些,調用getBean()是因爲Bean已經構造完畢,速度會更快。所以大部分系統都使用ApplicationContext,而只在資源較少的狀況下,才考慮使用BeanFactory。資源
4.AOP的實現策略開發
(1)Java SE動態代理:
使用動態代理能夠爲一個或多個接口在運行期動態生成實現對象,生成的對象中實現接口的方法時能夠添加加強代碼,從而實現AOP。缺點是隻能針對接口進行代理,另外因爲動態代理是經過反射實現的,有時可能要考慮反射調用的開銷。
(2)字節碼生成(CGLib 動態代理)
動態字節碼生成技術是指在運行時動態生成指定類的一個子類對象,並覆蓋其中特定方法,覆蓋方法時能夠添加加強代碼,從而實現AOP。其經常使用工具是cglib。
(3)定製的類加載器
當須要對類的全部對象都添加加強,動態代理和字節碼生成本質上都須要動態構造代理對象,即最終被加強的對象是由AOP框架生成,不是開發者new出來的。解決的辦法就是實現自定義的類加載器,在一個類被加載時對其進行加強。JBoss就是採用這種方式實現AOP功能。
(4)代碼生成
利用工具在已有代碼基礎上生成新的代碼,其中能夠添加任何橫切代碼來實現AOP。
(5)語言擴展
能夠對構造方法和屬性的賦值操做進行加強,AspectJ是採用這種方式實現AOP的一個常見Java語言擴展。get
核心概念io
一、橫切關注點
對哪些方法進行攔截,攔截後怎麼處理,這些關注點稱之爲橫切關注點
二、切面(aspect)
類是對物體特徵的抽象,切面就是對橫切關注點的抽象
三、鏈接點(joinpoint)
被攔截到的點,由於Spring只支持方法類型的鏈接點,因此在Spring中鏈接點指的就是被攔截到的方法,實際上鍊接點還能夠是字段或者構造器
四、切入點(pointcut)
對鏈接點進行攔截的定義
五、通知(advice)
所謂通知指的就是指攔截到鏈接點以後要執行的代碼,通知分爲前置、後置、異常、最終、環繞通知五類
六、目標對象
代理的目標對象
七、織入(weave)
將切面應用到目標對象並致使代理對象建立的過程
八、引入(introduction)
在不修改代碼的前提下,引入能夠在運行期爲類動態地添加一些方法或字段