天天看點

java使用動态代理來實作AOP(日志記錄)

AOP(面向方面)的思想,就是把項目共同的那部分功能分離開來,比如日志記錄,避免在業務邏輯裡面夾雜着跟業務邏輯無關的代碼。

下面是一個AOP實作的簡單例子:

java使用動态代理來實作AOP(日志記錄)

首先定義一些業務方法:

實作InvocationHandler接口,使用map來存儲不同的InvocationHandler對象,避免生成過多。

然後編寫一個Test類測試:

以後需要添加新的業務邏輯XXXService,隻需要調用

XXXService xs = LogInvoHandler.getProxyInstance(XXXServiceImpl.class);

即可。

也可以模仿Spring等架構的配置,把bean的類名配置在xml檔案中,如:

<bean id="bussinessService" class="com.wangjie.aoptest2.service.impl.BussinessServiceImpl">

然後在java代碼中解析xml,通過Class.forName("com.wangjie.aoptest2.service.impl.BussinessServiceImpl");獲得Class對象

然後通過LogInvoHandler.getProxyInstance(Class.forName("com.wangjie.aoptest2.service.impl.BussinessServiceImpl"));獲得代理對象Proxy

再使用反射去調用代理對象的方法。

運作結果如下:

九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.invohandler.LogInvoHandler invoke

INFO: ____invoke method: login; args: [zhangsan, 123456]; return: login success

INFO: ____invoke method: find; args: null; return: find success

九月 24, 2013 11:08:03 上午 com.wangjie.aoptest2.Test main

INFO: --------------------------------------

INFO: ____invoke method: work; args: null; return: work success

INFO: ____invoke method: sleep; args: null; return: sleep success

INFO: ____invoke method: login; args: [lisi, 654321]; return: login success