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");
}
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章