Spring的切面功能,是通過代理的方式來實現的,實現方式有JDK動態代理方式及Cglib的方式。
有時需要在service層通過AOP做一些日志、權限、監控等功能,但在service中進行自調用時,無法再次走進代理類中,因此會導致漏日志的情況出現。
此時,可通過AopContext.currentProxy()來解決問題。用AopContext.currentProxy().xxxx()的方式代替this.xxxx()的自調用方式。
AopContext.currentProxy()的本質是使用的ThreadLocal生成本地代理,這樣的做法可能影響性能,后續文章對ThreadLocal的內部原理和性能進行進一步深入!
AopContext.currentProxy()的局限性:
1)AopContext.currentProxy()調用的方法中,如果此方法再調用其他的service,則此方法必須是public的修飾符。否則會發現通過@Autowired注入的service值為null。
