//还以上文中静态代理的真实对象为例子,用动态代理去实现 public class UserDaoProxyHandler implements InvocationHandler(){ //持有真实事务类的实例 private UserDaoImpl target; //初识化真实事务类的实例 publicUserDaoProxyHandler(){ this.target = new UserDaoImpl(); } @Override public Object invoke(Object proxy, Method method, Object[] args)throws Throwable { System.out.println("前置通知,可以做数据校验,限流等操作"); try{ //真正调用真实事务类中的方法 o = method.invoke(target, args); System.out.println("返回通知"); }catch(Exception e){ System.out.println("异常通知,可以做异常相关处理"); } System.out.println("后置通知"); } //通过Proxy类放回代理实例 public Object getProxy(){ return Proxy.newProxyInstance(this.getClass.getClassLoader, target.getClass().getInterfaces(), this); } }
下面我们来写一个测试类去通过动态代理调用真实事务类中的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
public class proxyTest(){ @Test publicvoidtest(){ //创建调度处理器实例 UserDaoProxyHandler h = new UserDaoProxyHandler(); //获取用户代理类实例 UserDaoImpl useDaoImpl=(UserDaoImpl) h.getProxy(); //直接调用方法 userDaoImpl.userAdd("user1","123456"); userDaoImpl.userDelete("user1"); } }