AOP,面向切面編程。
在不改動代碼的前提下,靈活的在現有代碼的執行順序前後,添加進新規機能。
來一個簡單的Sample:
目標類:
[java]advice:只以Around advice為例
[java]編織切入關系的配置文件:
[html]Sample的啟動:
[java]以上代碼,用customerServiceProxy代理CustomerService的執行
在customerServiceProxy的配置中,定義了用hijackAroundMethodBean作為方法攔截器,在hijackAroundMethodBean中利用invoke方法,攔截住所有的方法調用,塞入自己的邏輯業務。
上面看到的是Spring的Sample。
其實,Spring的AOP也是調用了其他開源技術實現。
比較常用的是JDK自己的Proxy,和開源的CGLIB
兩者的區別,Proxy需要Advice必須從接口繼承過來。如果切入的目標物是實體類,則無法使用。
CGLIB則可以用於直接覆蓋實體類的方法。
Spring對以上兩種都有支持。
Spring在配置文件中,通過ProxyFactoryBean編織和實現了切面的構成。
我們在執行以下這行話的時候
CustomerService cust = (CustomerService) appContext
.getBean("customerServiceProxy");
其實是將動態對象的生成委托給了ProxyFactoryBean
當配置文件中 <bean>的class屬性配置的實現類是FactoryBean時,通過getBean方法返回的不是FactoryBean本身,而是 FactoryBean#getObject()方法所返回的對象,相當於FactoryBean#getObject()代理了getBean()方 法。
執行順序如下:
1. ProxyFactoryBean中的getObject
[java]2. ProxyFactoryBean中的initializeAdvisorChain
從配置文件中的advice list中取得interceptorNames,並將其加入advisorChain
[java] view plaincopyprint?