02-04 AOP学习之args

Spring AOP args使用示例

args:使用“args(参数类型列表)”匹配当前执行的方法传入的参数为指定类型的执行方法
注意是匹配传入的参数类型,不是匹配方法签名的参数类型;参数类型列表中的参数必须是类型全限定名,通配符不支持;args属于动态切入点,这种切入点开销非常大,非特殊情况最好不要使用

模式 描述
args (com.learn.model.Member,..) 任何一个以接受“传入参数类型为com.learn.model.Member”开头,且其后可跟任意个任意类型的参数的方法执行,args指定的参数类型是在运行时动态匹配的
  1. 创建实体类

    • 创建package命名为com.learn.model(根据实际情况修改)

    • 创建User,内容如下

      public class User {
          public void say() {
              System.out.println("user:hello");
          }
      }
      
    • 创建Member继承User,内容如下

      public class Member extends User{
          @Override
          public void say() {
              System.out.println("member:hello");
          }
      }
      
    • 创建Leader继承Member,内容如下

      public class Leader extends Member{
          @Override
          public void say() {
              System.out.println("leader:hello, members");
          }
      }
      
  2. 创建接口及其实现类

    • 创建package命名为com.learn.service(根据实际情况修改)

    • 创建接口IUserService,内容如下

      public interface IUserService {
          void sayHello(User user);
      }
      
    • 创建package命名为com.learn.service.impl(根据实际情况修改)

    • 创建接口IUserService的实现类UserService,内容如下

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

    • 创建package命名为com.learn.aop(根据实际情况修改)
    • 配置AOP,新建ExecutionAOP,内容如下
      @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. 创建测试用例

    @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());
        }
    
    }
    

    运行可得到结果

    ---------------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
    

    可以由结果分析得出结论:
    args与方法的参数类型无关,与传入的参数类型有关。
    而execution与方法的参数类型有关,与传入的参数类型无关。

目录
源码链接

你可能感兴趣的:(02-04 AOP学习之args)