this:使用“this(類型全限定名)”匹配當前AOP代理對象類型的執(zhí)行方法
注意 是AOP代理對象的類型匹配割坠,這樣就可能包括引入接口方法也可以匹配;注意this中使用的表達式必須是類型全限定名坟岔,不支持通配符
模式 | 描述 |
---|---|
this(com.learn.model.Member) |
當前AOP對象實現(xiàn)了Member接口/抽象類的某些方法,Member的父類未重載的方法不會被處理 |
target:使用“target(類型全限定名)”匹配當前目標對象類型的執(zhí)行方法
注意 是目標對象的類型匹配,這樣就不包括引入接口也類型匹配平委;注意target中使用的表達式必須是類型全限定名画拾,不支持通配符
模式 | 描述 |
---|---|
target(com.learn.model.Member) |
當前目標對象(非AOP對象)實現(xiàn)了Member接口/抽象類的某些方法啥繁,Member的父類未重載的方法也會被處理 |
-
創(chuàng)建組件
創(chuàng)建package命名為
com.learn.model
(根據(jù)實際情況修改)-
創(chuàng)建抽象類
User
,內(nèi)容如下public abstract class User { public abstract void who(); public void say() { System.out.println("hello"); } public void root() { System.out.println("user"); } }
-
創(chuàng)建組件
Member
青抛,內(nèi)容如下@Component public class Member extends User{ @Override public void who() { System.out.println("member"); } public void doSomething() { System.out.println("member doSomething"); } public void getCompany() { System.out.println("zero tec"); } }
-
創(chuàng)建組件
Leader
旗闽,內(nèi)容如下@Component public class Leader extends Member{ @Override public void say() { System.out.println("hello, members"); } @Override public void who() { System.out.println("leader"); } @Override public void doSomething() { System.out.println("leader doSomething"); } public void self() { System.out.println("leader self"); } }
-
創(chuàng)建AOP
- 創(chuàng)建package命名為
com.learn.aop
(根據(jù)實際情況修改) - 配置AOP,新建
ExecutionAOP
蜜另,內(nèi)容如下@Aspect @Component public class ExecutionAop { @Before("execution(* com.learn.model..*(..)) && this(com.learn.model.Member)") public void execute0(){ System.out.println("this(com.learn.model.Member)"); } @Before("execution(* com.learn.model..*(..)) && target(com.learn.model.Member)") public void execute1(){ System.out.println("target(com.learn.model.Member)"); } }
- 創(chuàng)建package命名為
-
創(chuàng)建測試用例
@RunWith(SpringRunner.class) @SpringBootTest public class ApplicationTests { @Resource private Member member; @Resource private Leader leader; // 實現(xiàn) @Test public void test1() { System.out.println("---------------member---------------"); member.who(); System.out.println("---------------leader---------------"); leader.who(); } @Test public void test2() { // 繼承 System.out.println("---------------member---------------"); member.say(); // 重載 System.out.println("---------------leader---------------"); leader.say(); } @Test public void test3() { System.out.println("---------------member---------------"); member.root(); System.out.println("---------------leader---------------"); leader.root(); } @Test public void test4() { // 獨有方法 System.out.println("---------------member---------------"); member.doSomething(); // 子類重寫 System.out.println("---------------leader---------------"); leader.doSomething(); } @Test public void test5() { System.out.println("---------------member---------------"); member.getCompany(); System.out.println("---------------leader---------------"); leader.getCompany(); } // 獨有的方法 @Test public void test6() { System.out.println("---------------leader---------------"); leader.self(); } }
-
運行test1可得到結(jié)果
---------------member--------------- this(com.learn.model.Member) target(com.learn.model.Member) member ---------------leader--------------- this(com.learn.model.Member) target(com.learn.model.Member) leader
由結(jié)果可知宪睹,對于重載的方法,this和target都會匹配到蚕钦。
-
運行test2可得到結(jié)果
---------------member--------------- target(com.learn.model.Member) hello ---------------leader--------------- this(com.learn.model.Member) target(com.learn.model.Member) hello, members
由結(jié)果可知亭病,target可以匹配到未重載的方法,而this不能
-
運行test3可得到結(jié)果
---------------member--------------- target(com.learn.model.Member) user ---------------leader--------------- target(com.learn.model.Member) user
和結(jié)論2一樣
-
運行test4可得到結(jié)果
---------------member--------------- this(com.learn.model.Member) target(com.learn.model.Member) member doSomething ---------------leader--------------- this(com.learn.model.Member) target(com.learn.model.Member) leader doSomething
由結(jié)果可知嘶居,this和target都能被繼承
-
運行test5可得到結(jié)果
---------------member--------------- this(com.learn.model.Member) target(com.learn.model.Member) zero tec ---------------leader--------------- this(com.learn.model.Member) target(com.learn.model.Member) zero tec
由結(jié)果可知罪帖,同上
-
運行test6可得到結(jié)果
---------------leader--------------- this(com.learn.model.Member) target(com.learn.model.Member) leader self
由結(jié)果可知,同上
總結(jié):
- 兩者都可繼承邮屁。
- 對于目標子類整袁,未重載的父類方法是不能被this匹配到的,可以被target匹配到佑吝。
-