springAOP的设计和实现(一)

代理模式的特性:

      代理模式是一种非常实用的变成思想。他可以帮助我们做很多事情。比如权限的拦截。方法的拦截等等。目前主要分为两种一种是JVM动态代理技术,和CGLIB代理技术。下面就来详细解释这两种方法。

     首先,JVM动态代理技术。显然是JDK为我们提供的一种代理技术。在JDK1.3以后的版本中实现了动态代理特性。通过JDK动态代理技术可以为任意的JAVA对象创建代理对象。具体的实现是在Java Reflection API中实现的。其中一个重要的对象就是Proxy对象。废话不多说,直接来看代码。

首先创建接口类:

package cn.dao;
/**
* 接口类
* @author Administrator
*
*/
public interface userdao {
public void save(String name);
}

接着实现这个类:

package cn.dao.imp;
import cn.dao.userdao;
/**
* 必须实现接口
* @author Administrator
*
*/
public class userdaoimp implements userdao {
private String name=null;
public userdaoimp(String name) {
this.name = name;
}
public userdaoimp() {
super();
}
public String getName() {
return name;
}
public void save(String name) {
System.out.println("save");
}
}

创建代理对象:

package cn.dao;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import cn.dao.imp.userdaoimp;
/**
* 必须实现接口InvocationHandler
* @author Administrator
*
*/
public class jdkproxyFactory implements InvocationHandler{
private Object target;
/**
* 创建 代理对象
* @param target
* @return
*/
public Object createFactory(Object target){
//给代理对象赋值
this.target=target;
//返回一个封装后的代理对象
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable {
Object result=null;
//强制转换成代理前对象
userdaoimp userdaoimp=(userdaoimp) this.target;
//判断权限后的操作
if (userdaoimp.getName()!=null) {
result=method.invoke(target, args);
}
return result;
}
}

下面是测试类:

import org.junit.Test;
import cn.dao.CGLIBPROXY;
import cn.dao.jdkproxyFactory;
import cn.dao.userdao;
import cn.dao.imp.userdaoimp;
import junit.framework.TestCase;
/**
* 测试类
* @author Administrator
*
*/
public class proxyTest extends TestCase {
@Test
public void testproxy(){
//实例化代理类
jdkproxyFactory jFactory=new jdkproxyFactory();
//强制转换成      ------>接口类
userdao userdao=(userdao)jFactory.createFactory(new userdaoimp());
//使用接口类调用方法
userdao.save("ss");
}
}

你可能感兴趣的:(java,proxy,动态,interface)