探讨下AOP代理和Java代理

hardlh 2009-10-24 11:29:10
刚在百度上无意间看到人问Spring AOP的代理,希望大家讨论一下。顺便大牛指点一下Java提供的代理
...全文
105 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
Purking 2010-01-03
  • 打赏
  • 举报
回复
请注意是 Spring AOP 不是 Spring AOP 代理, Spring AOP 是指, Spring 对于 AOP 的实现, 而 Spring 对
AOP 的实现是依赖与 Java 的动态代理与 CGLIB(字节码增强);

代理我们知道是怎么一回事, 举个例子: 我们去买联想的电脑, 但我们并不是去联想总工厂,而是去一些
经销商的店面买, 那么在此联想工厂是被代理的, 而经销商则是代理;
所以这里有三个概念: 被代理对象, 代理对象, 目标对象(我买电脑);

Java 的动态代理, 顾名思义, 其是动态的代理, 即 Java 来帮你动态的生成这个处于目标对象与被代理对象
中间的代理对象, 而不再需要你手动的去写这个代理类;
(被代理类的接口)Interfaces InvocationHandler
| |
Target ---> ProxyObj(代理类)----> Proxy(API) ----->自己的 InvocationHandler实现

hardlh 2010-01-03
  • 打赏
  • 举报
回复
翻上来哈
chaojiliubi 2009-10-25
  • 打赏
  • 举报
回复
java的代理(个人理解是对象传递访问的时候,不直接访问对象,而访问该对象的代理)

一个目标对象的接口 TargetInterface
一个目标对象 Target(普通的java类)
一个目标对象的代理类 MyProxy

public class MyProxy
{
public Object getProxy(Object object)
{
MyHandler myHandler = new MyHandler();

myHandler.setObject(object);

return Proxy.newProxyInstance(Target.class.getClassLoader(), object
.getClass().getInterfaces(), myHandler);
}
}
一个类似拦截器的类
public class Interceptor
{
public void before()
{
System.out.println("before");
}

public void after()
{
System.out.println("after");
}
}
一个实现InvocationHandler的handal类
public class MyHandler implements InvocationHandler
{
private Object object;

private Interceptor interceptor = new Interceptor();

public void setObject(Object object)
{
this.object = object;
}

public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
Object result = null;
//关键的地方
interceptor.before();

result = method.invoke(object, args);

interceptor.after();

return result;

}

}


最后一个测试类

public class Client
{
public static void main(String[] args)
{
TargetInterface target = new Target();

MyProxy myProxy = new MyProxy();

TargetInterface proxy = (TargetInterface)myProxy.getProxy(target);

proxy.doSomething();
}

}














前些日子自学了 stuts2.0 的一点对 java 代理的理解

spring的 AOP代理 貌似有点复杂
可以用 jdk的动态代理 代理接口 也可以用 第3方组件CGLIB 来代理类 感觉一般都先代理接口更加规范点

不是很清楚

67,512

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧