一:Advice(通知)
(1)定義在連接配接點做什麼,為切面增強提供織入接口。在spring aop中主要描述圍繞方法調用而注入的切面行為。
(2)spring定義了幾個時刻織入增強行為的接口
=>org.springframework.aop.BeforeAdvice
org.springframework.aop.MethodBeforeAdvice
=>org.springframework.aop.AfterAdvice
org.springframework.aop.AfterReturningAdvice
=>org.springframework.aop.ThrowsAdvice
二:PointCut(切點)
(1)決定Advice應該作用那些連接配接點。也就是說通過PointCut來定義需要增強的方法集合。
(2)spring定義的PointCut的接口
=>org.springframework.aop.Pointcut
=>org.springframework.aop.TruePointcut
=> org.springframework.aop.support.JdkRegexpMethodPointcut
(3)相關接口。PointCut接口會傳回兩個對象,一個ClassFilter,一個是MethodMatcher
=>org.springframework.aop.ClassFilter
=>org.springframework.aop.TrueClassFilter
=>org.springframework.aop.MethodMatcher 比對目前方法是否需要執行增強邏輯,也就是是否需要執行Advice接口的方法。
=>org.springframework.aop.TrueMethodMatcher
三:通知器皿(Advisor)
(1)完成對目标方法的切面增強設計(advice)和關注點的設計(PoinCut)以後,需要一個對象把他們結合起來,完成這個作用的就是(Advisor)
(2)spring定義的Advisor接口
=>org.springframework.aop.Advisor
=>org.springframework.aop.support.DefaultPointcutAdvisor
(3)Advisor的控制器的接口
=>org.springframework.aop.framework.adapter.AdvisorAdapter
=>org.springframework.aop.framework.adapter.AfterReturningAdviceAdapter 目标方法執行完執行該增強的控制器
=>org.springframework.aop.framework.adapter.MethodBeforeAdviceAdapter 目标方法未執行前執行該增強的控制器
=>org.springframework.aop.framework.adapter.ThrowsAdviceAdapter 目标方法執行過程抛出異常執行該增強的控制器
四:springAop的相關
(1)springAop的核心技術是動态代理。動态代理的技術是jdk的一個特征。
(2)springAop的代理對象生成案例
=>org.springframework.aop.framework.ProxyFactoryBean
=>org.springframework.aop.framework.ProxyFactory
五:ProxyFactoryBean的工作流程。
(1)實作FactoryBean接口的類,在想IOC容器申請bean的時候,其實傳回的是該類執行getObject()方法的傳回。
(2)ProxyFactoryBean的getObject()方法傳回的是目标對象的代理對象。
其執行過程
=>根據配置的interceptorNames的屬性值先初始化代理增強的鍊子.根據interceptorNames從IOC容器中得到增強類的bean,然後判斷其類型,形成DefaultPointcutAdvisor對象。
=>根據配置的targetName屬性值從IOC容器中得到目标對象的bean,形成一個SingletonTargetSource對象。
=>将其本身作為一個aop代理對象建立的資料配置類,建立一個動态代理對象,傳回給ioc容器申請。
(3)在執行目标對象的方法過程中,會根據執行的方法的對象,從代理鍊子裡找到所有的Advisor對象,然後利用其屬性Pointcut對象擷取ClassFilter, MethodMatcher來判斷目前Advisor是否要執行。如果執行,則加入執行代理鍊子中。以jdk動态代理為例子,是org.springframework.aop.framework.JdkDynamicAopProxy類中invoke(Object proxy, Method method, Object[] args)方法中這句代碼List<Object> chain = this.advised.getInterceptorsAndDynamicInterceptionAdvice(method, targetClass);。該句代碼中this.advised其實就是ProxyFactoryBean本身。
六案例
一:Advice的對象

View Code
二:目标對象

三:配置檔案

七:spring内部基于該中方式實作動态代理的案例。spring提供的HttpInvoker遠端調用.可以閱讀該類getObject方法。實作對Facade接口代理
org.springframework.remoting.httpinvoker.HttpInvokerProxyFactoryBean