完整源碼:https://github.com/947133297/cgLibDemogit
經過AOP來便捷地輸出日誌,能更加方便排查系統的bug,這個例子中簡單輸出自定義文件和函數執行時的參數,函數要不要輸出日誌,能夠經過註解來控制。github
兩個服務類代碼以下:spring
@Service @EnableLogger public class ServiceA { @LogBeforeExec("show方法執行前輸出") public void show(int dataA, String dataB, boolean dataC){ System.out.println("ServiceA show方法執行"); } } @Service public class ServiceB { public void show(int dataA, String dataB, boolean dataC){ System.out.println("ServiceB show方法執行"); } }
服務類A中,添加了自定義註解來控制,表明須要輸出日誌,而服務類B沒有添加註解,程序運行效果,無論經過單元測試仍是控制器來執行服務代碼,都會輸出:緩存
show方法執行前輸出 - [[1, 2, false]]
ServiceA show方法執行
ServiceB show方法執行函數
實現原理:經過BeanPostProcessor加工bean,加工過程當中經過cgLib織入AOP加強bean的功能。單元測試
拓展:測試
由於spring應用中基本都是單例,AOP攔截中獲取到的對象都會是同一個,因此能夠經過map將被代理對象與某片內存數據關聯起來,攔截方法以後,能夠作一些方法緩存之類的功能。spa
這個輸出日誌的功能,可能其餘工程也須要。因此能夠抽取出來以便於複用,抽取方式:將BeanPostProcessor的bean抽取到一個單獨的配置類X中,而後經過@Import將配置類X引入到當前工程中便可。X類相關的東西都存放到一個單獨的jar包中。代理