动态代理3之代理工厂实现
动态代理的深化:承接动态代理2( 对 上级实例进行 深化),也就是 spring 的前身
(必须掌握)实例:
文件说明:1.有一个Waiter接口,该接口有一个 server() 、ShouQian()方法
2.有一个 Waiter接口的实现类,ManWaiter类
3.一个 测试Test类
4. 后置增强接口: AfterAdvice 接口
5.前置增强接口:BeforeAdvice接口
6. 生成代理对象 的 ProxyFactory类
1. Waiter.java 接口
// 服务员 public interface Waiter { // 服务 public void serve();
//收钱 public void shouQian(); } |
2. BeforeAdvice.java 接口,前置增强接口
/** * 前置增强 * @author cxf * */ public interface BeforeAdvice { public void before(); } |
3. AfterAdvice.java 接口,后置增强接口
/** * @function: 后置增强 * @author not-bug * */ public interface AfterAdvice { public void after(); } |
4 . ManWaiter.java 类,该类实现了 Waiter接口
//该类实现了 Waiter 接口 public class ManWaiter implements Waiter { public void serve() { System.out.println("服务中..."); }
public void shouQian() { System.out.println("混蛋,给我钱!"); } } |
5. ProxyFactory.java 类,用来生成代理对象的类
/** * 它用来生成代理对象 * 它需要所有的参数 * * 目标对象 * * 增强 * @author cxf */ /** * 1. 创建代理工厂 * 2. 给工厂设置三样东西: * * 目标对象:setTargetObject(xxx); * * 前置增强:setBeforeAdvice(该接口的实现) * * 后置增强:setAfterAdvice(该接口的实现) * 3. 调用createProxy()得到代理对象 * * 执行代理对象方法时: * > 执行BeforeAdvice的before() * > 目标对象的目标方法 * > 执行AfterAdvice的after() * @author cxf * */ public class ProxyFactory { private Object targetObject;//目标对象 private BeforeAdvice beforeAdvice;//前置增强 private AfterAdvice afterAdvice;//后置增强
/** * 用来生成代理对象 * @return */ public Object createProxy() { /* * 1. 给出三大参数 */ ClassLoader loader = this.getClass().getClassLoader(); Class[] interfaces = targetObject.getClass().getInterfaces(); InvocationHandler h = new InvocationHandler() { public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { /* * 在调用代理对象的方法时会执行这里的内容 */ // 执行前置增强 if(beforeAdvice != null) { beforeAdvice.before(); }
Object result = method.invoke(targetObject, args);//执行目标对象的目标方法 // 执行后置增强 if(afterAdvice != null) { afterAdvice.after(); }
// 返回目标对象的返回值 return result; } }; /* * 2. 得到代理对象 */ Object proxyObject = Proxy.newProxyInstance(loader, interfaces, h); return proxyObject; }
public Object getTargetObject() { return targetObject; } public void setTargetObject(Object targetObject) { this.targetObject = targetObject; } public BeforeAdvice getBeforeAdvice() { return beforeAdvice; } public void setBeforeAdvice(BeforeAdvice beforeAdvice) { this.beforeAdvice = beforeAdvice; } public AfterAdvice getAfterAdvice() { return afterAdvice; } public void setAfterAdvice(AfterAdvice afterAdvice) { this.afterAdvice = afterAdvice; } } |
6. Test.java ,测试类
/* * 目标是让目标对象和增强都可以切换! */ public class Demo3 { @Test public void fun1() { ProxyFactory factory = new ProxyFactory();//创建工厂 factory.setTargetObject(new ManWaiter());//设置目标对象 factory.setBeforeAdvice(new BeforeAdvice() {//设置前置增强 public void before() { System.out.println("您好不好!"); } });
factory.setAfterAdvice(new AfterAdvice() {//设置后置增强 public void after() { System.out.println("再见不见!"); } });
Waiter waiter = (Waiter)factory.createProxy(); //waiter.shouQian(); waiter.serve(); }
//转账方法 public void zhuanZhang() { /* * 1. * 2. * 3. */ } } |
运行结果: