this:使用“this(類型全限定名)”匹配當前AOP代理對象類型的執行方法
注意 是AOP代理對象的類型匹配,這樣就可能包括引入接口方法也可以匹配;注意this中使用的表達式必須是類型全限定名,不支持通配符
模式 | 描述 |
---|---|
this(com.learn.model.Member) |
當前AOP對象實現了Member接口/抽象類的某些方法,Member的父類未重載的方法不會被處理 |
target:使用“target(類型全限定名)”匹配當前目標對象類型的執行方法
注意 是目標對象的類型匹配,這樣就不包括引入接口也類型匹配;注意target中使用的表達式必須是類型全限定名,不支持通配符
模式 | 描述 |
---|---|
target(com.learn.model.Member) |
當前目標對象(非AOP對象)實現了Member接口/抽象類的某些方法,Member的父類未重載的方法也會被處理 |
-
創建組件
創建package命名為
com.learn.model
(根據實際情況修改)-
創建抽象類
User
,內容如下public abstract class User { public abstract void who(); public void say() { System.out.println("hello"); } public void root() { System.out.println("user"); } }
-
創建組件
Member
,內容如下@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"); } }
-
創建組件
Leader
,內容如下@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"); } }
-
創建AOP
- 創建package命名為
com.learn.aop
(根據實際情況修改) - 配置AOP,新建
ExecutionAOP
,內容如下@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)"); } }
- 創建package命名為
-
創建測試用例
@RunWith(SpringRunner.class) @SpringBootTest public class ApplicationTests { @Resource private Member member; @Resource private Leader leader; // 實現 @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可得到結果
---------------member--------------- this(com.learn.model.Member) target(com.learn.model.Member) member ---------------leader--------------- this(com.learn.model.Member) target(com.learn.model.Member) leader
由結果可知,對于重載的方法,this和target都會匹配到。
-
運行test2可得到結果
---------------member--------------- target(com.learn.model.Member) hello ---------------leader--------------- this(com.learn.model.Member) target(com.learn.model.Member) hello, members
由結果可知,target可以匹配到未重載的方法,而this不能
-
運行test3可得到結果
---------------member--------------- target(com.learn.model.Member) user ---------------leader--------------- target(com.learn.model.Member) user
和結論2一樣
-
運行test4可得到結果
---------------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
由結果可知,this和target都能被繼承
-
運行test5可得到結果
---------------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
由結果可知,同上
-
運行test6可得到結果
---------------leader--------------- this(com.learn.model.Member) target(com.learn.model.Member) leader self
由結果可知,同上
總結:
- 兩者都可繼承。
- 對于目標子類,未重載的父類方法是不能被this匹配到的,可以被target匹配到。
-