1. 程式人生 > >Spring aop簡單示例

Spring aop簡單示例

AOP概念:     面向切面(方面)程式設計,是對所有物件或者是一類物件程式設計,核心是(在不增加程式碼的基礎上,還增加新功能);     將通知配置到目標物件,生成代理物件。
AOP術語:    1.通知:切面的實際實現,他通知系統新的行為。如在日誌通知包含了實現日誌功能的程式碼,如向日志文件寫日誌。通知在連線點插入到應用系統中。    2.連線點:應用程式執行過程中插入切面的地點,可以是方法呼叫,異常丟擲,或者要修改的欄位。    3.切入點:定義了通知應該應用在哪些連線點,通知可以應用到AOP框架支援的任何連線點。    4.引入:為類新增新方法和屬性。    5.目標物件:被通知的物件。既可以是你編寫的類也可以是第三方類    6.代理物件
:將通知應用到目標物件後建立的物件,應用系統的其他部分不用為了支援代理物件而改變。    7.切面:要實現的交叉功能,是系統模組化的一個切面或領域。如日誌記錄。      8.織入:將切面應用到目標物件從而建立一個新代理物件的過程。織入發生在目標物件生命週期的多個點上:                  編譯期:切面在目標物件編譯時織入.這需要一個特殊的編譯器.                  類裝載期:切面在目標物件被載入JVM時織入.這需要一個特殊的類載入器.                  執行期:切面在應用系統執行時織入. AOP的5種通知型別: 前置通知:在方法外部呼叫,方法呼叫前呼叫的方法。實現介面:org.springframework.aop.MethodBeforeAdvice 後置通知
:在方法外部呼叫,方法呼叫後呼叫的方法。實現介面:Org.springframework.aop.AfterReturningAdvice 環繞通知:在方法內部呼叫,剛進入方法內部時、方法結束時呼叫的方法,在前置通知方法後,後置通知方法前。實現介面org.aopalliance.intercept.MethodInterceptor 異常通知:在方法跑出異常時,呼叫的方法。實現介面:Org.springframework.aop.ThrowsAdvice 引入通知:若不用引入通知,則所有的連線點都是切入點。用了引入通知後,可以過濾連線點,讓部分連線點成為切入點。實現介面:org.springframework.aop.support.NameMatchMethodPointcutAdvisor spring AOP:只支援方法連線點,不提供屬性接入點,所以類有設定屬性的方法就可以了,可以沒有屬性 spring的aop中,當你通過代理物件去實現aop的時候,獲取的ProxyFactoryBean是什麼型別?
答: 返回的是一個代理物件,如果目標物件實現了介面,則spring使用jdk 動態代理技術,如果目標物件沒有實現介面,則spring使用CGLIB技術. 前置通知實現:     1.編寫目標物件
        <bean id="obj" class="hsp.spring.bean.Obj"> <property name="name" value="obj"/> </bean>     2.編寫前置通知
        實現org.springframework.aop.MethodBeforeAdvice介面的before方法     3.配置applicationContext.xml
        將通知配置到applicationContext.xml中
        <bean id="myMethodBeforeAdvice" class="hsp.spring.app.MyMethodBeforeAdvice"/>         通知織入到目標物件,配置目標物件及其實現的介面、織入通知
<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 目標物件:配置被代理的物件 --> <property name="target" ref="obj"/> <!-- 配置代理介面 --> <property name="proxyInterfaces"> <value>hsp.spring.bean.ObjInter</value> </property> <!-- 織入:把通知織入到代理物件 --> <property name="interceptorNames">                         <!--list:當通知多個時使用,只織入一個通知可以省略-->
<list> <value>myMethodBeforeAdvice</value> </list> </property> </bean> 環繞通知實現:     1.編寫目標物件
        <bean id="obj" class="hsp.spring.bean.Obj"> <property name="name" value="obj"/> </bean>     2.編寫環繞通知
        實現org.aopalliance.intercept.MethodInterceptor介面的invoke方法     3.配置applicationContext.xml
        將通知配置到applicationContext.xml中
        <bean id="myMethodInterceptor" class="hsp.spring.app.MyMethodInterceptor"/>         通知織入到目標物件,配置目標物件及其實現的介面、織入通知
<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 目標物件:配置被代理的物件 --> <property name="target" ref="obj"/> <!-- 配置代理介面 --> <property name="proxyInterfaces"> <value>hsp.spring.bean.ObjInter</value> </property> <!-- 織入:把通知織入到代理物件 --> <property name="interceptorNames">                     <value>myMethodInterceptor</value> </property> </bean>     注意:在環繞通知的實現方法中,若不執行MethodInvocation.proceed()方法,則程式從環繞通知結束終止 後置通知實現:     1.編寫目標物件
        <bean id="obj" class="hsp.spring.bean.Obj"> <property name="name" value="obj"/> </bean>     2.編寫後置通知
        實現org.springframework.aop.AfterReturningAdvice介面的 AfterReturningAdvice 方法     3.配置applicationContext.xml
        將通知配置到applicationContext.xml中
        <bean id="myAfterReturningAdvice" class="hsp.spring.app.MyAfterReturningAdvice"/>         通知織入到目標物件,配置目標物件及其實現的介面、織入通知
<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 目標物件:配置被代理的物件 --> <property name="target" ref="obj"/> <!-- 配置代理介面 --> <property name="proxyInterfaces"> <value>hsp.spring.bean.ObjInter</value> </property> <!-- 織入:把通知織入到代理物件 --> <property name="interceptorNames">                     <value>myAfterReturningAdvice</value> </property> </bean> 異常通知實現:     1.編寫目標物件
        <bean id="obj" class="hsp.spring.bean.Obj"> <property name="name" value="obj"/> </bean>     2.編寫異常通知
        實現org.springframework.aop.ThrowsAdvice介面,這個介面只有標識,沒有方法。可以實現public void afterThrowing(Exception ex)。其他方法可參照Spring API     3.配置applicationContext.xml
        將通知配置到applicationContext.xml中
        <bean id="myThrowAdvice" class="hsp.spring.app.MyThrowAdvice"/>         通知織入到目標物件,配置目標物件及其實現的介面、織入通知
<bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 目標物件:配置被代理的物件 --> <property name="target" ref="obj"/> <!-- 配置代理介面 --> <property name="proxyInterfaces"> <value>hsp.spring.bean.ObjInter</value> </property> <!-- 織入:把通知織入到代理物件 --> <property name="interceptorNames">                     <value>myThrowAdvice</value> </property> </bean> 切入通知實現:     切入通知不需要編寫java程式碼,只需要配置applicationContext.xml。有選擇的將連線點變成切入點(預設連線點全部是切入點)
    以前置通知為例:
        目標物件配置到applicaitonContext.xml中
        <bean id="obj" class="hsp.spring.bean.Obj"> <property name="name" value="obj"/> </bean>         將前置通知配置到applicationContext.xml中
        <bean id="myMethodBeforeAdvice" class="hsp.spring.app.MyMethodBeforeAdvice"/>         切入通知配置,給前置通知加上過濾器,此時只有mappedNames中的方法,才會變成切入點
<bean id="myMethodBeforeAdviceFilter" class="org.springframework.aop.support.NameMatchMethodPointcutAdvisor"> <property name="advice" ref="myMethodBeforeAdvice"/> <property name="mappedNames"> <value>sayHello</value> </property> </bean> <bean id="proxyFactoryBean" class="org.springframework.aop.framework.ProxyFactoryBean"> <!-- 目標物件:配置被代理的物件 --> <property name="target" ref="obj"/> <!-- 配置代理介面 --> <property name="proxyInterfaces"> <value>hsp.spring.bean.ObjInter</value> </property> <!-- 織入:把通知織入到代理物件,此時裡面的值,為加上過濾器之後的bean id --> <property name="interceptorNames"> <value>myMethodBeforeAdviceFilter</value> </property> </bean>