java設計模式之--jdk動態代理(實現aop編程)

與靜態代理類對照的是動態代理類,動態代理類的字節碼在程序運行時由Java反射機制動態生成,無需程序員手工編寫它的源代碼。動態代理類不僅簡化了編程工作,而且提高了軟件系統的可擴展性,因爲Java 反射機制可以生成任意類型的動態代理類。java.lang.reflect 包中的Proxy類和InvocationHandler 接口提供了生成動態代理類的能力。
但是,JDK的動態代理依靠接口實現,如果有些類並沒有實現接口,則不能使用JDK代理,這就要使用cglib動態代理了。

一下是jdk動態代理實例

一:接口
package com.supan.dao;
/**
* <訪問數據庫dao層結果>
*/
public interface DaoInterface
{
/**
* <增加>
*/
public void insert(String id, String name);

/**
* <更新>
*/
public void update(String id, String name);

/**
* <刪除>
*/
public void delete(String id, String name);

/**
* <查詢>
*/
public void select(String id, String name);
}


二:實現類
package com.supan.dao.imp;
import com.supan.dao.DaoInterface;
public class PersonDaoImpl implements DaoInterface
{
@Override
public void insert(String id, String name)
{
System.out.println("********");
System.out.println("增加");
System.out.println(id);
System.out.println(name);
System.out.println("********");
}

@Override
public void update(String id, String name)
{
System.out.println("********");
System.out.println("更新");
System.out.println(id);
System.out.println(name);
System.out.println("********");
}

@Override
public void delete(String id, String name)
{
System.out.println("********");
System.out.println("刪除");
System.out.println(id);
System.out.println(name);
System.out.println("********");
}

@Override
public void select(String id, String name)
{
System.out.println("********");
System.out.println("查詢");
System.out.println(id);
System.out.println(name);
System.out.println("********");
}
}


三:實現jdk動態代理類的代理工廠
package com.supan.proxy;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
* <該類是jdk動態代理模式中的核心類>
* @author 陳超陽
*/
public class DaoProxyObject implements InvocationHandler
{
/**該屬性請用Object類型,通用性強*/
private Object target;

/**
* <該方法用來返回動態代理對象>
* @param target 目標對象
* @return 代理對象
*/
public Object bind(Object target)
{
this.target = target;
return Proxy.newProxyInstance(target.getClass().getClassLoader(), target.getClass().getInterfaces(), this);
}

/**
* <動態代理必須要實現的方法,在該方法中可以實現AOP編程>
*/
@Override
public Object invoke(Object proxy, Method method, Object[] args)
throws Throwable
{
Object result = null;

if(method.getName().equals("update") || method.getName().equals("delete") && method.getName().equals("indeset"))
{
System.out.println("事務開始");
method.invoke(target, args);
System.out.println("事務結束");
}
else
{
System.out.println("非事務方法開始調用");
result = method.invoke(target, args);
System.out.println("非事務方法調用結束");
}

return result;
}
}


四:測試
package com.supan.test;
import com.supan.dao.DaoInterface;
import com.supan.dao.imp.PersonDaoImpl;
import com.supan.proxy.DaoProxyObject;

public class MyDynaProxyTest
{
public static void main(String[] args)
{
DaoProxyObject proxy = new DaoProxyObject();
DaoInterface pd = (DaoInterface)proxy.bind(new PersonDaoImpl());
pd.update("33", "chenchaoyang");
pd.select("33", "dddd");
}
}


五:輸出結果
事務開始
********
更新
33
chenchaoyang
********
事務結束
非事務方法開始調用
********
查詢
33
dddd
********
非事務方法調用結束
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章