首先解釋下AOP :在程序運行時,動態的將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面編程
- 一般而言,我們管切入到指定類指定方法的代碼片段為切面,而切入的哪些類、哪些方法則叫切入點。有了AOP,我們就可以把幾個類共有的代碼,抽取到一個切片中,等到需要時在切入對象中去,從而改變其原有的行為。
- AOP就是OOP的補充而已。OOP從橫向上區分出一個個類來,而AOP則從縱向上向對象加入特定的代碼。有了AOP,OOP變得立體了,如果加上時間維度,AOP使OOP從二維變成三維。
- 從技術上來說,AOP基本上是通過代理機制實現的。
- 經典的Spring AOP是基於動態代理技術的。在實現方式上,最常用的是實現MethodInterceptor接口來提供環繞通知,創建若干代理,然后使用ProxyBeanFactory配置工廠Bean,生成攔截器鏈,完成攔截。
- 我們通常使用注解的形式使用AOP
- 在xml中的配置
- <context:component-scan base-package="demo.spring"/>
- <aop:aspectj-autoproxy />
- context:component-scan,使用@Component自動發布bean,需要配置這個元素
- aop:aspectj-autoproxy,使用@AspectJ及其它AOP注解需要配置,否則無法使用注解;@AspectJ注解,將@Component自動發布出來的"interceptor" bean轉換為一個aspectj切面,而@Pointcut、@Before、@After、@Around等注解,功能與在xml文件中配置是一樣的;@Pointcut注解下面的方法內容無意義,只是要求一個相應方法提供注解依附。
- 注解只能使用在能活的源碼的場景,如果不能獲取源碼,則只能通過xml配置的形式,將制定的對象配置成攔截器,對指定目標進行攔截;因此,通過xml文件配置,而不是注解,是更加通用的方式。
- 除基礎的springframework框架的jar外,還需要依賴cglib、aspectj的jar包,maven配置如下:
<dependency> <groupId>cglib</groupId> <artifactId>cglib</artifactId> <version>2.2</version> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.6.11</version> </dependency>
- 在xml中的配置
總結:Spring實現AOP,動態代理技術的兩種實現是jdk動態代理、cglib代理,根據被通知的方法是否為接口方法,來選擇使用哪種代理生成策略。
- jdk動態代理:原理是實現接口的實例,攔截定於接口中的目標方法,,性能更優,是spring生成代理的優先選擇。
- cglib代理:原理是使用cglib庫中的字節碼動態生成技術,生成被代理類的子類實例,可以攔截代理類中的任一public方法的調用,無論目標方法是否定義與接口中,更通用,但性能相對jdk代理差一些。