? ? 這是由于 Spring AOP (包括動態(tài)代理和 CGLIB 的 AOP) 的限制導(dǎo)致的.?Spring AOP 并不是擴展了一個類(目標對象),?而是使用了一個代理對象來包裝目標對象, 并攔截目標對象的方法調(diào)用.
? ? 這樣的實現(xiàn)帶來的影響是: 在目標對象中調(diào)用自己類內(nèi)部實現(xiàn)的方法時, 這些調(diào)用并不會轉(zhuǎn)發(fā)到代理對象中, 甚至代理對象都不知道有此調(diào)用的存在.
? ? 當調(diào)用 helloWithoutAop() 方法時, 先進入到此代理對象的同名方法中, 然后在代理對象中執(zhí)行 AOP 邏輯(因為 helloWithoutAop() 并沒有注入 AOP 橫切邏輯, 因此調(diào)用它不會有額外的事情發(fā)生), 當代理對象中執(zhí)行完畢橫切邏輯后,?才將調(diào)用請求轉(zhuǎn)發(fā)到目標對象的 hello() 方法上.?因此當代碼執(zhí)行到 hello() 方法內(nèi)部時, 此時的?this?其實就不是代理對象了, 而是目標對象, 因此再調(diào)用 timerService.helloWithoutAop(),自然就沒有 AOP 效果了.
? ? 代碼示例以及解決辦法見 示例代碼