模拟AOP 面向切面编程
2013-12-19 16:21
106 查看
模拟AOP 面向切面编程
假设我们有个类UserDAO 里面有个save方法我们现在要在这个方法前加一个日志
当然我们可以创建一个日志类,然后将测试代码组合到源代码,不过这样已经改动了源代码了
所以我们用动态代理来解决这个问题
LogInterceptor.java===============
public class LogInterceptor implements InvocationHandler {
private Object target;
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public void beforeMethod(Method m) {
System.out.println(m.getName() + " start");
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
beforeMethod(m);
m.invoke(target, args);
return null;
}
}
UserDAOImple.java=====================
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println("user saved!");
}
public void delete() {
System.out.println("user deteleted");
}
}
Test.java========================用于测试.
public void testProxy() {
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor();
li.setTarget(userDAO);
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
System.out.println(userDAOProxy.getClass());
userDAOProxy.delete();
userDAOProxy.save(new User());
}
假设我们有个类UserDAO 里面有个save方法我们现在要在这个方法前加一个日志
当然我们可以创建一个日志类,然后将测试代码组合到源代码,不过这样已经改动了源代码了
所以我们用动态代理来解决这个问题
LogInterceptor.java===============
public class LogInterceptor implements InvocationHandler {
private Object target;
public Object getTarget() {
return target;
}
public void setTarget(Object target) {
this.target = target;
}
public void beforeMethod(Method m) {
System.out.println(m.getName() + " start");
}
public Object invoke(Object proxy, Method m, Object[] args)
throws Throwable {
beforeMethod(m);
m.invoke(target, args);
return null;
}
}
UserDAOImple.java=====================
public class UserDAOImpl implements UserDAO {
public void save(User user) {
System.out.println("user saved!");
}
public void delete() {
System.out.println("user deteleted");
}
}
Test.java========================用于测试.
public void testProxy() {
UserDAO userDAO = new UserDAOImpl();
LogInterceptor li = new LogInterceptor();
li.setTarget(userDAO);
UserDAO userDAOProxy = (UserDAO)Proxy.newProxyInstance(userDAO.getClass().getClassLoader(), userDAO.getClass().getInterfaces(), li);
System.out.println(userDAOProxy.getClass());
userDAOProxy.delete();
userDAOProxy.save(new User());
}
相关文章推荐
- MQTT的学习研究(十一) IBM MQTT 简单发布订阅实例
- Eclipse 关闭 updating indexes
- Struts2 验证框架不起作用的几种可能
- 基于RSA和DES双重加密的可靠通信
- (转)C++入门
- C# 事件委托 【开门两次 开枪】
- MQTT的学习研究(九)基于HTTP GET MQTT 抓取消息服务端使用
- C++标准库类型(转)
- c# -- 解决FromsAuthentication上下文不存在
- MQTT的学习研究(八)基于HTTP DELETE MQTT 订阅消息服务端使用
- C++标准库类型2(转)
- 解决phpwind 9 转换到 discuz x 3.1的头像仍然不显示问题
- MQTT的学习研究(七)基于HTTP POST MQTT 发布消息服务端使用
- axis2 spring集成开发webServices
- delphi7中的format函数
- java 文件复制
- C++的学习(转)
- 普通javabean转成Map
- Openssl应用编程
- C++中的动态类型判断