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)匹配的
|
-
創(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"); } }
-
創(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(); } }
-
創(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, ..))"); } }
- 創(chuàng)建package命名為
-
創(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)。