參考 輕量級javaEE企業應用實戰(第三版)Struts2+spring3+hibernate整合開發 --李剛 第九章 java
參考文章:http://rejoy.iteye.com/blog/1627405 spring
實例:模擬spring的aop代理 this
Dog.java hibernate
public interface Dog { //info方法聲明 public void info(); //run方法聲明 public void run(); }GunDog.java 實現類
public class GunDog implements Dog { //info方法實現,僅僅打印一個字符串 public void info() { System.out.println("我是一隻獵狗"); } //run方法實現,僅僅打印一個字符串 public void run() { System.out.println("我奔跑迅速"); } }
TxUtil.java 代理
public class TxUtil { //第一個攔截器方法:模擬事務開始 public void beginTx() { System.out.println("=====模擬開始事務====="); } //第二個攔截器方法:模擬事務結束 public void endTx() { System.out.println("=====模擬結束事務====="); } }
MyInvokationHandler.java code
public class MyInvokationHandler implements InvocationHandler { //須要被代理的對象 private Object target; public void setTarget(Object target) { this.target = target; } //執行動態代理對象的全部方法時,都會被替換成執行以下的invoke方法 public Object invoke(Object proxy, Method method, Object[] args) throws Exception { TxUtil tx = new TxUtil(); //執行TxUtil對象中的beginTx。 tx.beginTx(); //以target做爲主調來執行method方法 Object result = method.invoke(target , args); //執行TxUtil對象中的endTx。 tx.endTx(); return result; } }MyProxyFactory.java
public class MyProxyFactory { //爲指定target生成動態代理對象 public static Object getProxy(Object target) throws Exception { //建立一個MyInvokationHandler對象 MyInvokationHandler handler = new MyInvokationHandler(); //爲MyInvokationHandler設置target對象 handler.setTarget(target); //建立、並返回一個動態代理 return Proxy.newProxyInstance(target.getClass().getClassLoader() , target.getClass().getInterfaces(), handler); } }Test.java
public class Test { public static void main(String[] args) throws Exception { //建立一個原始的GunDog對象,做爲target Dog target = new GunDog(); //以指定的target來建立動態代理 Dog dog = (Dog)MyProxyFactory.getProxy(target); //調用代理對象的info()和run()方法 dog.info(); dog.run(); } }