面試題思考:什麼是基於註解的切面實現?(AOP是Aspect Oriented Program的首字母縮寫)

首先解釋下AOP :在程序運行時,動態的將代碼切入到類的指定方法、指定位置上的編程思想就是面向切面編程spring

  • 通常而言,咱們管切入到指定類指定方法的代碼片斷爲切面,而切入的哪些類、哪些方法則叫切入點。有了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>

     

總結:Spring實現AOP,動態代理技術的兩種實現是jdk動態代理、cglib代理,根據被通知的方法是否爲接口方法,來選擇使用哪一種代理生成策略。
  • jdk動態代理:原理是實現接口的實例,攔截定於接口中的目標方法,,性能更優,是spring生成代理的優先選擇。
  • cglib代理:原理是使用cglib庫中的字節碼動態生成技術,生成被代理類的子類實例,能夠攔截代理類中的任一public方法的調用,不管目標方法是否認義與接口中,更通用,但性能相對jdk代理差一些。
相關文章
相關標籤/搜索