Spring AOP args使用示例
args:使用“args(参数类型列表)”匹配当前执行的方法传入的参数为指定类型的执行方法
注意是匹配传入的参数类型,不是匹配方法签名的参数类型;参数类型列表中的参数必须是类型全限定名,通配符不支持;args属于动态切入点,这种切入点开销非常大,非特殊情况最好不要使用
模式 | 描述 |
---|---|
args (com.learn.model.Member,..) |
任何一个以接受“传入参数类型为com.learn.model.Member ”开头,且其后可跟任意个任意类型的参数的方法执行,args指定的参数类型是在运行时动态匹配的
|
-
创建实体类
创建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"); } }
-
创建接口及其实现类
创建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(); } }
-
创建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, ..))"); } }
- 创建package命名为
-
创建测试用例
@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与方法的参数类型有关,与传入的参数类型无关。