Spring AOP JDK动态代理

在没有使用Spring之前,如果要对DAO层进行修改,比如说做数据安全性验证。那么,就需要对DAO层中的每一个方法都进行修改,项目小了好 说,大了的话呢?不久后又要删掉这一功能呢?那岂不又是费神之事。

这一问题使用AOP(Aspect Oriented Programming 面向切面编程)就好解决的多了。面向切面编程,就像使用FilterServlet(过滤器)对字符编码进行转换时一样。当BIZ层调用DAO层中的方法 时,可以对其实施拦截,在前之前或之后插入所要执行的操作。

下面看看具体如何对这一问题进行应用。首先创建一个安全性检测类SecurityHandler并让它实现InvocationHandler接 口。声明一个Object类型的变量用于存储目标对象(我们要对谁进行拦截)。提供一个方法getProxy(),该方法接收目标对象然后返回该对象的代 理对象。在invoke()方法中先进行数据安全性检测,然后再调用目标对象的方法。因为无法确定所调用的方法是或否有返回值,所以默认的令其返回 Object类型。完整代码如下:

package cn.ineeke.spring;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
public class SecurityHandler implements InvocationHandler {
//用于存储目标对象
private Object obj;
//获得目标对象的代理
public Object getProxy(Object obj){
this.obj = obj;
return Proxy.newProxyInstance(obj.getClass().getClassLoader(),
obj.getClass().getInterfaces(),
this);
}
//方法调用
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
// TODO Auto-generated method stub
printSomthing();
Object ret = null;
try {
ret = method.invoke(this.obj, args);
} catch (Exception e) {
e.printStackTrace();
}
return ret;
}
private void printSomthing(){
System.out.println("--------Security----------");
}
}

接下来编写一个测试类。

package cn.ineeke.spring;
public class Client {
public static void main(String[] args) {
SecurityHandler sryHandler = new SecurityHandler();
IUserDAO userDAO = (IUserDAO) sryHandler.getProxy(new UserDAOImpl());
userDAO.getUser();
}
}

上面的代码中,首先创建了一个SecurityHandler的实例sryHandler,然后调用getProxy()方法根据具体的目标对象创 建具体的代理对象,最后通过代理来调用相关的方法。这么一来,无论是开发阶段还是后期的维护中,如果需要改动,则只需要改动 SecurityHandler类即可,不再需要对DAO中每个方法逐一改动了。


转载原创文章请注明,转载自:Neeke[http://www.ineeke.com]

本文链接: http://www.ineeke.com/archives/spring-aop-jdk-dynamicproxy/

除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。

您可以自由: 复制、发行、展览、表演、放映、广播或通过信息网络传播本作品 创作演绎作品

惟须遵守下列条件: 署名 — 您必须按照作者或者许可人指定的方式对作品进行署名。

你可能感兴趣的:(spring,jdk,AOP,代理,动态)