動態代理的深化:承接動態代理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. ???????? */ ????} } |
?
運行結果: