java使用动态代理来实现AOP
来源:才华咖 本文已影响2.85W人
来源:才华咖 本文已影响2.85W人
下面是一个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 static
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
java使用ConcurrentHashMap和计数器实现锁的方法
深入解析hashmap,java实现原理
JavaScript实现的div拖动效果实例代码
如何使用Java实现AC自动机全文检索实例
Java入门教程:如何使用一个Java
讲解Java的Spring框架中的AOP实现
Java Ajax jsonp跨域请求详解
Java import以及Java类的搜索路径
Java中import的使用
使用ajax操作JavaScript对象的方法
如何使用JavaScript实现倒计时
java与javascript之间json格式数据互转详解
在Java中执行JavaScript代码
Javascript实例教程如何使用HoTMetal
php动态生成JavaScript代码
JavaScript与java语言的区别
javascript实现贪吃蛇代码
JavaScript与java语言有何不同
Java for循环语句使用实例
关于java 四舍五入使java保留2位小数示例讲解
如何实现bootstrap jquery dataTable异步ajax刷新表格数据
在JavaScript中操作数组之map()方法的使用示例
几分钟理解Java中的动态代理
JavaScript与java语言有何区别
如何使用JavaScript实现香港身份格式及真伪性验证
JavaScript实现网页刷新代码段
教职工思想动态现实表现动态评估
梦想,当然是用来实现的
生态现代诗歌
Java中如何实现显示动态的时间
php和javascript之间变量的传递实现代码
常用排序算法之JavaScript实现代码段
Java 队列实现原理及简单实现代码
2017最新javascript中AJAX用法
关于JavaScript中isPrototypeOf函数作用和使用实例
java与JavaScript语言有何不同
Javascript和Java语言间的异同比较
如何使用javascript实现瀑布流及效果加载
Java动态代理实现AOP的方法
30行代码实现Javascript中的MVC