天天看点

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