java使用动态代理来实现AOP

来源:才华咖  本文已影响2.85W人 

下面是一个AOP实现的简单例子:

java使用动态代理来实现AOP

首先定义一些业务方法:

复制代码 代码如下:

/**

* Created with IntelliJ IDEA.

* Author: wangjie

* Date: 13-9-23

* Time: 下午3:49

*/

public interface BussinessService {

public String login(String username, String password);

public String find();

}

public class BussinessServiceImpl implements BussinessService {

private Logger logger = ogger(lass()impleName());

@Override

public String login(String username, String password) {

return "login success";

}

@Override

public String find() {

return "find success";

}

}

复制代码 代码如下:

/**

* Created with IntelliJ IDEA.

* Author: wangjie

* Date: 13-9-24

* Time: 上午10:27

*/

public interface WorkService {

public String work();

public String sleep();

}

public class WorkServiceImpl implements WorkService{

@Override

public String work() {

return "work success";

}

@Override

public String sleep() {

return "sleep success";

}

}

实现InvocationHandler接口,使用map来存储不同的cationHandler对象,避免生成过多。

复制代码 代码如下:

package handler;

import cationHandler;

import od;

import y;

import ys;

import Map;

import er;

/**

* Created with IntelliJ IDEA.

* Author: wangjie

* Date: 13-9-23

* Time: 下午3:47

*/

public class LogInvoHandler implements InvocationHandler{

private Logger logger = ogger(lass()impleName());

private Object target; // 代理目标

private Object proxy; // 代理对象

private static HashMap<Class, LogInvoHandler> invoHandlers = new HashMap<Class, LogInvoHandler>();

private LogInvoHandler() {

}

/**

* 通过Class来生成动态代理对象Proxy

* @param clazz

* @return

*/

public synchronized staticT getProxyInstance(Classclazz){

LogInvoHandler invoHandler = (clazz);

if(null == invoHandler){

invoHandler = new LogInvoHandler();

try {

T tar = nstance();

arget(tar);

roxy(roxyInstance(lass()lassLoader(),

lass()nterfaces(), invoHandler));

} catch (Exception e) {

tStackTrace();

}

(clazz, invoHandler);

}

return (T)roxy();

}

@Override

public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

Object result = ke(target, args); // 执行业务处理

// 打印日志

("____invoke method: " + ame()

+ "; args: " + (null == args ? "null" : st(args)ring())

+ "; return: " + result);

return result;

}

public Object getTarget() {

return target;

}

public void setTarget(Object target) {

et = target;

}

public Object getProxy() {

return proxy;

}

public void setProxy(Object proxy) {

y = proxy;

}

}

然后编写一个Test类测试:

复制代码 代码如下:

/**

* Created with IntelliJ IDEA.

* Author: wangjie

* Date: 13-9-24

* Time: 上午9:54

*/

public class Test {

public static Logger logger = ogger(impleName());

public static void main(String[] args) {

BussinessService bs = roxyInstance(s);

n("zhangsan", "123456");

();

("--------------------------------------");

WorkService ws = roxyInstance(s);

();

p();

("--------------------------------------");

BussinessService bss = roxyInstance(s);

n("lisi", "654321");

();

}

}

以后需要添加新的业务逻辑XXXService,只需要调用

XXXService xs = roxyInstance(s);

即可。

也可以模仿Spring等框架的配置,把bean的类名配置在xml文件中,如:

然后在java代码中解析xml,通过ame("inessServiceImpl");获得Class对象

然后通过roxyInstance(ame("inessServiceImpl"));获得代理对象Proxy

再使用反射去调用代理对象的方法。

运行结果如下:

九月 24, 2013 11:08:03 上午 nvoHandler invoke

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

九月 24, 2013 11:08:03 上午 nvoHandler invoke

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

九月 24, 2013 11:08:03 上午 main

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

九月 24, 2013 11:08:03 上午 nvoHandler invoke

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

九月 24, 2013 11:08:03 上午 nvoHandler invoke

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

九月 24, 2013 11:08:03 上午 main

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

九月 24, 2013 11:08:03 上午 nvoHandler invoke

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

九月 24, 2013 11:08:03 上午 nvoHandler invoke

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

相关内容

热门精选