02-04 AOP學(xué)習(xí)之a(chǎn)rgs

Spring AOP args使用示例

args:使用“args(參數(shù)類型列表)”匹配當(dāng)前執(zhí)行的方法傳入的參數(shù)為指定類型的執(zhí)行方法
注意是匹配傳入的參數(shù)類型,不是匹配方法簽名的參數(shù)類型;參數(shù)類型列表中的參數(shù)必須是類型全限定名,通配符不支持;args屬于動態(tài)切入點,這種切入點開銷非常大,非特殊情況最好不要使用

模式 描述
args (com.learn.model.Member,..) 任何一個以接受“傳入?yún)?shù)類型為com.learn.model.Member”開頭,且其后可跟任意個任意類型的參數(shù)的方法執(zhí)行,args指定的參數(shù)類型是在運行時動態(tài)匹配的
  1. 創(chuàng)建實體類

    • 創(chuàng)建package命名為com.learn.model(根據(jù)實際情況修改)

    • 創(chuàng)建User,內(nèi)容如下

      public class User {
          public void say() {
              System.out.println("user:hello");
          }
      }
      
    • 創(chuàng)建Member繼承User,內(nèi)容如下

      public class Member extends User{
          @Override
          public void say() {
              System.out.println("member:hello");
          }
      }
      
    • 創(chuàng)建Leader繼承Member,內(nèi)容如下

      public class Leader extends Member{
          @Override
          public void say() {
              System.out.println("leader:hello, members");
          }
      }
      
  2. 創(chuàng)建接口及其實現(xiàn)類

    • 創(chuàng)建package命名為com.learn.service(根據(jù)實際情況修改)

    • 創(chuàng)建接口IUserService,內(nèi)容如下

      public interface IUserService {
          void sayHello(User user);
      }
      
    • 創(chuàng)建package命名為com.learn.service.impl(根據(jù)實際情況修改)

    • 創(chuàng)建接口IUserService的實現(xiàn)類UserService,內(nèi)容如下

      @Service
      public class UserService implements IUserService{
          @Override
          public void sayHello(User user) {
              user.say();
          }
      }
      
  3. 創(chuàng)建AOP

    • 創(chuàng)建package命名為com.learn.aop(根據(jù)實際情況修改)
    • 配置AOP,新建ExecutionAOP,內(nèi)容如下
      @Aspect
      @Component
      public class ExecutionAop {
      
          @Before("execution(* com.learn..*(..)) && args(com.learn.model.Member, ..)")
          public void execute0() {
              System.out.println("args(com.learn.model.Member, ..)");
          }
      
          @Before("execution(* com.learn..*(com.learn.model.Member, ..))")
          public void execute1() {
              System.out.println("execution(* com.learn..*(com.learn.model.Member, ..))");
          }
      
          @Before("execution(* com.learn..*(com.learn.model.User, ..))")
          public void execute2() {
              System.out.println("execution(* com.learn..*(com.learn.model.User, ..))");
          }
      
      }
      
  4. 創(chuàng)建測試用例

    @RunWith(SpringRunner.class)
    @SpringBootTest
    public class ApplicationTests {
    
        @Resource
        private IUserService userService;
    
        @Test
        public void test1() {
            System.out.println("---------------user---------------");
            userService.sayHello(new User());
            System.out.println("---------------member---------------");
            userService.sayHello(new Member());
            System.out.println("---------------leader---------------");
            userService.sayHello(new Leader());
        }
    
    }
    

    運行可得到結(jié)果

    ---------------user---------------
    execution(* com.learn..*(com.learn.model.User, ..))
    user:hello
    ---------------member---------------
    args(com.learn.model.Member, ..)
    execution(* com.learn..*(com.learn.model.User, ..))
    member:hello
    ---------------leader---------------
    args(com.learn.model.Member, ..)
    execution(* com.learn..*(com.learn.model.User, ..))
    leader:hello, members
    

    可以由結(jié)果分析得出結(jié)論:
    args與方法的參數(shù)類型無關(guān),與傳入的參數(shù)類型有關(guān)。
    而execution與方法的參數(shù)類型有關(guān),與傳入的參數(shù)類型無關(guān)。

目錄
源碼鏈接

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容