参考 轻量级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(); } }