<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ??碼云GVP開源項目 12k star Uniapp+ElementUI 功能強大 支持多語言、二開方便! 廣告
                [toc] 切點聲明有兩部分:一個是方法名稱和參數的簽名,一個是切點表達式確定關注哪些執行方法.在@AspectJ 注解風格的aop中,切點表達式使用注解`@Pointcut`,方法必須是`void`1返回類型. 下面例子清楚的區分切點簽名和切點表達式.名稱為`anyOldTransfer`的切點,匹配執行所有名稱為`transfer`的方法. ~~~java @Pointcut("execution(* transfer(..))")// the pointcut expression private void anyOldTransfer() {}// the pointcut signature ~~~ ## Supported Pointcut Designators * execution-匹配執行方法的連接點,是spring aop的主要切點指示符 * within - 限制匹配某些類型中的連接點 * this - 限制匹配給定類型的實例中的連接點 * target - 限制匹配給定類型中的連接點 * args - 限制匹配給定參數類型中的連接點 ## Combining pointcut expressions 切點表達式可以結合使用 '&&', '||' 和 '!'.也可以引用名稱. ~~~java //匹配所有的public方法 @Pointcut("execution(public * *(..))") private void anyPublicOperation() {} //trading包目錄下的所有方法 @Pointcut("within(com.xyz.someapp.trading..*)") private void inTrading() {} //trading包目錄下的所有public方法 @Pointcut("anyPublicOperation() && inTrading()") private void tradingOperation() {} ~~~ 如上所示,最佳實踐是從較小的命名組件構建更復雜的切入點表達式。 ## Sharing common pointcut definitions 企業級應用中,經常需要按模塊或特定的操作引用一些切面.為了達到這個目的,建議定義系統架構層的切面,抓住常見的切點表達式.一個典型的切面如下: ~~~java package com.xyz.someapp; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Pointcut; @Aspect public class SystemArchitecture { /** * web層連接點,如果方法定義在 * 包com.xyz.someapp.web package或子包下面類的方法中 */ @Pointcut("within(com.xyz.someapp.web..*)") public void inWebLayer() {} /** * service層連接點,如果方法定義在 * 包com.xyz.someapp.service package或子包下面類的方法中 */ @Pointcut("within(com.xyz.someapp.service..*)") public void inServiceLayer() {} /** * dao層,,如果方法定義在 * 包com.xyz.someapp.dao或子包下面類的方法中 */ @Pointcut("within(com.xyz.someapp.dao..*)") public void inDataAccessLayer() {} /** *具體業務是service接口中任意方法的執行,接口在"service"包,實現類在子包 * 如果按功能劃分service接口(例如,com.xyz.someapp.abc.service and com.xyz.someapp.def.service) 則使用切點表達式"execution(* com.xyz.someapp..service.*.*(..))" */ @Pointcut("execution(* com.xyz.someapp..service.*.*(..))") public void businessService() {} /** *數據訪問層的操作是dao接口的執行,接口定義在包"dao" , a實現類在子包 */ @Pointcut("execution(* com.xyz.someapp.dao.*.*(..))") public void dataAccessOperation() {} } ~~~ 這樣的切面中定義的切點,通過切點表達式可以引用到任何地方.例如service層提供事務,可以這么寫: ~~~xml <aop:config> <aop:advisor pointcut="com.xyz.someapp.SystemArchitecture.businessService()" advice-ref="tx-advice"/> </aop:config> <tx:advice id="tx-advice"> <tx:attributes> <tx:method name="*" propagation="REQUIRED"/> </tx:attributes> </tx:advice> ~~~ `<aop:config>` 和 `<aop:advisor>`的用法參考[Schema-based AOP support](https://docs.spring.io/spring/docs/5.0.7.RELEASE/spring-framework-reference/core.html#aop-schema).事務管理參考[Transaction Management](https://docs.spring.io/spring/docs/5.0.7.RELEASE/spring-framework-reference/data-access.html#transaction). ## Examples spring aop開發者常用的切點指示符是`execution`,完整格式為 ~~~ execution(modifiers-pattern? ret-type-pattern declaring-type-pattern?name-pattern(param-pattern) throws-pattern?) ~~~ 除了返回類型,名稱,參數,其他模式都是可選的.返回類型模式限制了連接點方法必須匹配.最常見的是使用`*`作為返回類型模式,它匹配任何返回類型。完全限定類型名稱必須匹配方法返回給定類型.名稱模式匹配方法名稱.可以使用`*`通配完整或部分名稱.可以在名稱模式末尾加上`.` 指定聲明類型模式. 參數模式稍微復雜一些:`()`匹配不帶參數的方法,而`(..)`匹配任意數量的參數(零或更多)。 模式`(*)`匹配采用任何類型的一個參數的方法,`(*,String)`匹配采用兩個參數的方法,第一個可以是任何類型,第二個必須是String。 有關更多信息,請參閱AspectJ編程指南的語言語義部分。 下面給出一些切點的樣例 * 所有public方法 ~~~java execution(public * *(..)) ~~~ * 所有set開頭的方法 ~~~ execution(* set*(..)) ~~~ * 接口AccountService的所有方法 ~~~ execution(* com.xyz.service.AccountService.*(..)) ~~~ * 所有service包下的方法 ~~~ execution(* com.xyz.service.*.*(..)) ~~~ * 所有service包或子包下的方法 ~~~ execution(* com.xyz.service..*.*(..)) ~~~ * 所有service包內的類型 ~~~ within(com.xyz.service.*) ~~~ * 所有service包或子包下的類型 ~~~ within(com.xyz.service..*) ~~~ * 所有實現了接口`AccountService `的代理 ~~~ this(com.xyz.service.AccountService) ~~~ * 所有實現了接口`AccountService `的類 ~~~ target(com.xyz.service.AccountService) ~~~ * 所有一個參數的方法,且參數類型在運行時為`Serializable` ~~~ args(java.io.Serializable) ~~~ 區別于`execution(* *(java.io.Serializable))`表示方法的簽名,指定了參數類型. * 所有使用了注解`@Transactional`的目標類 ~~~ @target(org.springframework.transaction.annotation.Transactional) ~~~ * 所有使用了注解`@Transactional`的聲明類 ~~~ @within(org.springframework.transaction.annotation.Transactional) ~~~ * 所有使用了注解`@Transactional`的執行方法 ~~~ @annotation(org.springframework.transaction.annotation.Transactional) ~~~ * 所有一個參數的方法,且參數類型在運行時為注解`@Classified` ~~~ @args(com.xyz.security.Classified) ~~~ * 所有名稱為`tradeService`的bean ~~~ bean(tradeService) ~~~ * 所有名稱匹配為`*Service`的bean ~~~ bean(*Service) ~~~ ## Writing good pointcuts 在編譯期間,AspectJ 檢查代碼,搜索匹配切點表達式的連接點,這是一個耗費性能的過程,所以在定義切點表達式的時候,盡可能精確. 表達式的指示符分為三組:`kinded,scoping和context` * kinded 類型指示符,選擇接入點類型的指示符,如 execution, get, set, call, handler * Scoping 范圍指示符,如within, withincode * Contextual 上下文指示符是基于上下文匹配的指示符。 例如:this,target,@ annotation 一個寫得很好的切入點應該嘗試包括至少前兩種類型(kinded和scoping),而如果希望基于連接點上下文匹配,則可以包括上下文指示符,或者綁定該上下文以在建議中使用。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看