您的位置:首页 > 编程语言 > Java开发

15_传智播客Spring2.5视频教程_使用JDK中的Proxy技术实现AOP功能

2009-04-11 22:10 1151 查看
在PersonServiceBean的方法被调用时候,判断user是否为空,

为空则不执行。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

package xxl.aop.one.service.impl;

import xxl.aop.one.service.PeronService;

public class PersonServiceBean implements PeronService {

String user = null;

public PersonServiceBean() {

}

public PersonServiceBean(String user) {
this.user = user;
}

public String getName() {
System.out.print("getName");
return this.user;
}

public void sava(String name) {

System.out.print("save");
}

public void update(String name, Integer id) {
System.out.print("update");
}

public String getUser() {
return user;
}

利用代理模式实现。

代理模式 :它的特征是代理类与委托类有同样的接口,
代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,
代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
这种代理机制是面向接口,而不是面向类的。

按照代理类的创建时期,代理类可分为两种。

静态代理类:
由程序员创建或由特定工具自动生成源代码,再对其编译。在程序运行前,代理类的.class文件就已经存在了。

动态代理类:在程序运行时,运用反射机制动态创建而成。在程序运行前,它的.class文件就已经存在了,这种代理类称为动态代理类。

与静态代理类对照的是动态代理类,动态代理类的字节码在程序运行时由Java反射机制动态生成,无需程序员手工编写它的源代码。动态代理类不仅简化了编程工作,而且提高了软件系统的可扩展性,因为Java 反射机制可以生成任意类型的动态代理类。jav///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////a.lang.reflect 包中的Proxy类和InvocationHandler 接口提供了生成动态代理类的能力。

接口:

package xxl.aop.one.service;

public interface PeronService {

public void sava(String name);
public void update(String name, Integer id);
public String getName();
public String getUser();
}

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

代理类

package xxl.aop.one.service.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

// 代理模式 :它的特征是代理类与委托类有同样的接口,
// 代理类主要负责为委托类预处理消息、过滤消息、把消息转发给委托类,以及事后处理消息等。
// 代理类与委托类之间通常会存在关联关系,一个代理类的对象与一个委托类的对象关联,
// 代理类的对象本身并不真正实现服务,而是通过调用委托类的对象的相关方法,来提供特定的服务。
// 这种代理机制是面向接口,而不是面向类的。

import xxl.aop.one.service.PeronService;

public class JDKProxyFactory implements InvocationHandler {

private Object object;
public Object createProxyInstance(Object object) {
this.object = object;

// this = 代理类
return Proxy.newProxyInstance(this.object.getClass().getClassLoader(),
this.object.getClass().getInterfaces(), this);
}

// 通过实现 invoke 接口 实现对方法的拦截
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// 代理类与委托类有同样的接口。
PeronService bean = (PeronService)this.object;
Object result = null;
// 在回调 函数里 通过接口 调用对象
if (bean.getUser() != null){
// 调用目标对象方法
result = method.invoke(bean, args);
}
return result;
}
}
//////////////////////////////////////////////////////////////////////////////////////

代理模式的使用场合: 1.远程代理(Remote Proxy):为一个对象在不同的地址空间提供局部代表。这样可以隐藏一个对象存在于不同地址空间的事实。在.NET中,调用远程的 WEB Service或者远程对象都用到了远程代理。对于WEB Service,我们都不陌生,当我们在项目中添加一个WEB引用,引用一个webService,此时会在项目中生成一个WebReference的文件夹和一下文件,其实,他们就是代理,这就使得客户端程序调用代理就可以解决远程访问的问题。 2.虚拟代理(Virturl Proxy):根据需要创建一个资源消耗较大的对象,使得此对象只在需要时才会被真正创建。使用虚拟代理模式的好处就是代理对象可以在必要的时候才将被代理的对象加载;代理可以对加载的过程加以必要的优化。当一个模块的加载十分耗费资源的情况下,虚拟代理的好处就非常明显。使用虚拟代理,有时可以是程序性能达到最优化,例如,我们打开一个html网页时,里面有很多文字和图片,你可以很快的打开,但你看到是只是文字,而图片却是一张张下载完后你才能看到,那些未打开的图片框,就是通过虚拟代理来替代真实的图片,此时代理存储了真实图片的路径和尺寸。 3.保护代理(Protection Proxy):控制对一个对象的访问,如果需要,可以给不同的用户提供不同级别的使用权限。保护代理的好处是它可以在运行时间对用户的有关权限进行检查,然后在核实后决定将调用传递给被代理的对象。 4.智能指引(Smart Reference):取代了简单的指针,并在访问对象时执行一些附加操作。 5.Copy-on-Write代理:虚拟代理的一种。把复制(克隆)拖延到只有在客户端需要时,才真正采取行动。 6.Cache代理:为某一个目标操作的结果提供临时的存储空间,以便多个客户端可以共享这些结果。 7.防火墙(Firewall)代理:保护目标,不让恶意用户接近。 8.同步化(Synchronization)代理:使几个用户能够同时使用一个对象而没有冲突。 实现要点: 1.代理对象和被代理对象都遵循一致的接口。 2.在某些情况下,可以不必保持接口一致性,如果封装确实需要损失一些透明度,那么也可以认为是Proxy。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: