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配置上通知的使用類似