天天看點

spring-aop筆記整理

spring-aop筆記整理

##spring-aop筆記整理 1, 動态代理(由于aop底層是java的動态代理,先簡單介紹動态代理)

          特點:位元組碼随用随建立,随用随加載               作用:不修改源碼基礎上對方法增強                分類:                      基于接口的動态代理                      基于子類的動态代理       

1,基于子類的動态代理

               涉及的類:Enhancer                提供者:第三方cglib庫            如何建立代理對象:                使用Enhancer類中的create方法            建立代理對象的要求:                被代理 類不能是最終類            create方法的參數:                class:位元組碼(如:producers.getClass())                   他是用于加載代理對象位元組碼                Callback,用于提供增強的代碼                    他是讓我們寫如何代理,我們一般都是些一個接口的實作類,通常情況下都是匿名内部類,但不是必須的                    此接口的實作類都是誰用誰寫                    我們一般寫的是該接口的子接口的實作類,MethodInterceptor        

2,基于接口的動态代理

                涉及的類:Proxy                 提供者:jdk官方             如何建立代理對象:                 使用Proxy類中的newProxyInstance方法             建立代理對象的要求:                 被代理 類最少實作一個接口,如果沒有,則不能使用              newProxyInstance方法的參數:                  ClassLoader:類加載器(如:producers.getClass().getClassLoader(),)                    他是用于加載代理對象位元組碼的,和被代理對象使用相同的類加載器,固定寫法                 Class[],位元組碼數組(如:producers.getClass().getInterfaces(),)                     他是用于讓代理對象和被代理對象有相同的方法,固定寫法                 InvocationHandler,用于提供增強的代碼                     他是讓我們寫如何代理,我們一般都是些一個接口的實作類,通常情況下都是匿名内部類,但不是必須的                     此接口的實作類都是誰用誰寫

2,spring-aop 1,概述:

                   aop即面向切面程式設計,通俗講就是 把我們程式重複代碼抽取出來,在需要執行的時候,運用動态代理技術,在不修改源碼的情況下,對已有方法進行增強

                優勢:減少重複代碼,提高開發效率,維護友善   

  2,xml的配置使用

                  spring中基于IOC的配置步驟                      1,把通知bean也交給spring來管理                        2,使用aop:config标簽開始aop的配置                        3,使用aop:aspect标簽表明配置切面                              id屬性:給切面提供唯一表識                              ref屬性:時指定通知類的bean的id(通知是該類中的方法)                        4,在aop:aspect标簽内部使用對應标簽來配置通知類型                  (注:讓printLog方法在切入點方法執行之前,是以是前置通知)                           aop:before:表示配置前置通知(如前置通知的配置:<aop:before method=“printLog” pointcut="execution( * …. (…))"></aop:before>)                          method屬性,用于指定Logger類中那個方法是前置通知( 注此處的前置通知隻是示例,通知一共有前置通知、後置通知、異常通知、最終通知以及環繞通知)                          pointcut屬性:用于指定切入點表達式,該表達式的含義指的是對業務層中哪些方法增強(注: 此标簽寫在aop:aspect内部隻能目前切面使用,它還可以寫在aop:aspect外面,此時就變成了所有切面可用, 當切面通知需要使用時,隻需配置 pointcut-ref屬性)                              切入點表達式的寫法:                                關鍵字:execution(表達式)                                表達式:                                   通路修飾符   傳回值 報名.包名.報名…類名.方法名(參數清單)                                     标準的表達式寫法:                                         public void com.itheima.service.impl.AccountServiceImpl.saveAccount()                                     通路修飾符可以省略                                         void com.itheima.service.impl.AccountServiceImpl.saveAccount()                                     傳回值可以使用通配符,并表示任意傳回                                         com.itheima.service.impl.AccountServiceImpl.saveAccount()                                     報名也可以使用通配符,但是有幾級包就寫幾個*.                                        * .. ..AccountServiceImpl.saveAccount()                                     包名可以使用…表示目前包及其子包                                         * …AccountServiceImpl.saveAccount()                                     類名和方法名都可以使用來實作通配                                         * …. ()                                     參數清單:                                         可以直接寫的資料類型:                                             基本類型直接寫名稱          int                                             引用類型寫包名.類名的方式   java.lang.String                                        可以使用通配符來表示任意類型,但是必須有參數                                       可以使用…來表示有無參數均可,有參數可以是任意類型                                     全通配的方式:                                          …. (…)                                     實際開發中切入點表達式的通常寫法:                                    切到業務層實作類下的所有方法                                         com.itheima.service.impl. .(…) 注:環繞通知的使用和動态代理類似,也是spring提供一種可以在代碼中手動控制增強方法何時執行的方式                

3,注解的配置使用

( 注:使用aop注解時,需要在配置檔案中添加context:component-scan 以及aop:aspectj-autoproxy,第二個用來開啟aop注解支援 )

                        1, @Pointcut(“execution(* com.itheima.service.impl. .(…))”)--------》該注解常配置在一個方法體為空的方法上,方法名為該切入點的id(如: @Pointcut(“execution(* com.itheima.service.impl..(…))”) private void ptl(){} )                         2,@Before---------》前置通知,其屬性需配置切入點的id

                        3, @AfterReturning---------》後置通知,其屬性需配置切入點的id

                        4,@AfterThrowing---------》異常通知,其屬性需配置切入點的id

                        5,@After---------》最終通知,其屬性需配置切入點的id

                        6, @Around---------》環繞通知,其屬性需配置切入點的id

              以上注解的使用和xml配置上通知的使用類似

繼續閱讀