动态代理3之代理工厂实现
動(dòng)態(tài)代理的深化:承接動(dòng)態(tài)代理2( 對(duì) 上級(jí)實(shí)例進(jìn)行 深化),也就是 spring 的前身
(必須掌握)實(shí)例:
文件說(shuō)明:1.有一個(gè)Waiter接口,該接口有一個(gè) server() 、ShouQian()方法
2.有一個(gè) Waiter接口的實(shí)現(xiàn)類(lèi),ManWaiter類(lèi)
3.一個(gè) 測(cè)試Test類(lèi)
???? 4. 后置增強(qiáng)接口: AfterAdvice 接口
???? 5.前置增強(qiáng)接口:BeforeAdvice接口
???? 6. 生成代理對(duì)象 的 ProxyFactory類(lèi)
1. Waiter.java 接口
// 服務(wù)員 public interface Waiter { ????// 服務(wù) ????public void serve(); ???? ????//收錢(qián) ????public void shouQian(); } |
?
2. BeforeAdvice.java 接口,前置增強(qiáng)接口
/** * 前置增強(qiáng) * @author cxf * */ public interface BeforeAdvice { ????public void before(); } |
?
3. AfterAdvice.java 接口,后置增強(qiáng)接口
/** * @function: 后置增強(qiáng) * @author not-bug * */ public interface AfterAdvice { ????public void after(); } |
?
4 . ManWaiter.java 類(lèi),該類(lèi)實(shí)現(xiàn)了 Waiter接口
//該類(lèi)實(shí)現(xiàn)了 Waiter 接口 public class ManWaiter implements Waiter { ????public void serve() { ????????System.out.println("服務(wù)中..."); ????} ???? ????public void shouQian() { ????????System.out.println("混蛋,給我錢(qián)!"); ????} } |
?
5. ProxyFactory.java 類(lèi),用來(lái)生成代理對(duì)象的類(lèi)
/** * 它用來(lái)生成代理對(duì)象 * 它需要所有的參數(shù) * * 目標(biāo)對(duì)象 * * 增強(qiáng) * @author cxf */ /** * 1. 創(chuàng)建代理工廠 * 2. 給工廠設(shè)置三樣?xùn)|西: * * 目標(biāo)對(duì)象:setTargetObject(xxx); * * 前置增強(qiáng):setBeforeAdvice(該接口的實(shí)現(xiàn)) * * 后置增強(qiáng):setAfterAdvice(該接口的實(shí)現(xiàn)) * 3. 調(diào)用createProxy()得到代理對(duì)象 * * 執(zhí)行代理對(duì)象方法時(shí): * > 執(zhí)行BeforeAdvice的before() * > 目標(biāo)對(duì)象的目標(biāo)方法 * > 執(zhí)行AfterAdvice的after() * @author cxf * */ public class ProxyFactory { ????private Object targetObject;//目標(biāo)對(duì)象 ????private BeforeAdvice beforeAdvice;//前置增強(qiáng) ????private AfterAdvice afterAdvice;//后置增強(qiáng) ???? ? ???? ????/** ???? * 用來(lái)生成代理對(duì)象 ???? * @return ???? */ ????public Object createProxy() { ????????/* ???????? * 1. 給出三大參數(shù) ???????? */ ????????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 { ????????????????/* ???????????????? * 在調(diào)用代理對(duì)象的方法時(shí)會(huì)執(zhí)行這里的內(nèi)容 ???????????????? */ ????????????????// 執(zhí)行前置增強(qiáng) ????????????????if(beforeAdvice != null) { ????????????????????beforeAdvice.before(); ????????????????} ???????????????? ????????????????Object result = method.invoke(targetObject, args);//執(zhí)行目標(biāo)對(duì)象的目標(biāo)方法 ????????????????// 執(zhí)行后置增強(qiáng) ????????????????if(afterAdvice != null) { ????????????????????afterAdvice.after(); ????????????????} ???????????????? ????????????????// 返回目標(biāo)對(duì)象的返回值 ????????????????return result; ????????????} ????????}; ????????/* ???????? * 2. 得到代理對(duì)象 ???????? */ ????????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 ,測(cè)試類(lèi)
? /* * 目標(biāo)是讓目標(biāo)對(duì)象和增強(qiáng)都可以切換! */ public class Demo3 { ????@Test ????public void fun1() { ????????ProxyFactory factory = new ProxyFactory();//創(chuàng)建工廠 ????????factory.setTargetObject(new ManWaiter());//設(shè)置目標(biāo)對(duì)象 ????????factory.setBeforeAdvice(new BeforeAdvice() {//設(shè)置前置增強(qiáng) ????????????public void before() { ????????????????System.out.println("您好不好!"); ????????????} ????????}); ???????? ????????factory.setAfterAdvice(new AfterAdvice() {//設(shè)置后置增強(qiáng) ????????????public void after() { ????????????????System.out.println("再見(jiàn)不見(jiàn)!"); ????????????} ????????}); ???????? ????????Waiter waiter = (Waiter)factory.createProxy(); ????????//waiter.shouQian(); ????????waiter.serve(); ????} ???? ????//轉(zhuǎn)賬方法 ????public void zhuanZhang() { ????????/* ???????? * 1. ???????? * 2. ???????? * 3. ???????? */ ????} } |
?
運(yùn)行結(jié)果:
轉(zhuǎn)載于:https://www.cnblogs.com/Prozhu/p/5452962.html
總結(jié)
以上是生活随笔為你收集整理的动态代理3之代理工厂实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 民生信用卡自由分期可以提前还款吗?剩下的
- 下一篇: Celery的实践指南