激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術(shù)|正則表達(dá)式|C/C++|IOS|C#|Swift|Android|VB|R語(yǔ)言|JavaScript|易語(yǔ)言|vb.net|

服務(wù)器之家 - 編程語(yǔ)言 - Java教程 - Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解

Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解

2021-02-22 10:51zhouyeqin Java教程

這篇文章主要介紹了Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解,具有一定參考價(jià)值,需要的朋友可以了解下。

本節(jié)要點(diǎn):

java靜態(tài)代理
jdk動(dòng)態(tài)代理

1 面向?qū)ο笤O(shè)計(jì)思想遇到的問(wèn)題

在傳統(tǒng)oop編程里以對(duì)象為核心,并通過(guò)對(duì)象之間的協(xié)作來(lái)形成一個(gè)完整的軟件功能,由于對(duì)象可以繼承,因此我們可以把具有相同功能或相同特征的屬性抽象到一個(gè)層次分明的類結(jié)構(gòu)體系中。隨著軟件規(guī)范的不斷擴(kuò)大,專業(yè)化分工越來(lái)越系列,以及oop應(yīng)用實(shí)踐的不斷增多,隨之也暴露了一些oop無(wú)法很好解決的問(wèn)題。

現(xiàn)在假設(shè)系統(tǒng)中有三段完全相似的代碼,這些代碼通常會(huì)采用“復(fù)制”、“粘貼”方式來(lái)完成,通過(guò)這種方式開(kāi)發(fā)出來(lái)的軟件如圖所示:

Spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解

可能讀者已經(jīng)發(fā)現(xiàn)了這種做法的不足之處,如果有一天,藍(lán)色背景的代碼需要修改,那是不是要同時(shí)修改三個(gè)地方?如果不僅僅是這三個(gè)地方包含這段代碼,而是100個(gè),甚至是1000個(gè)地方,那會(huì)是什么后果?

記錄日志在代碼中無(wú)處不在---先來(lái)看一個(gè)例子:

為了跟蹤應(yīng)用程序的運(yùn)行過(guò)程,很多方法都需要記錄日志信息。我們一般這樣寫(xiě):

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//log4j的使用見(jiàn)文章“log4j介紹”
import org.apache.log4j.logger;
public class person {
    private logger logger = logger.getlogger(person.class);
    public void sleep(){
        logger.info(“開(kāi)始執(zhí)行時(shí)間:“ + new date());
        system.out.println("睡覺(jué)中");
        logger.info(“執(zhí)行結(jié)束時(shí)間:” + new date());
    }
    public void eating(){
        logger.info("開(kāi)始執(zhí)行時(shí)間:“ + new date()");
        system.out.println("正在吃飯中");
        logger.info("“執(zhí)行結(jié)束時(shí)間:” + new date()");
    }
}

提問(wèn):弊端在哪里?

l混淆了業(yè)務(wù)方法本身的職責(zé)

l維護(hù)工作量巨大

2解決方案1

靜態(tài)代理:
   1、需要知道核心類(被代理類)是哪一個(gè)類,并且有什么方法。 
   2、非核心的代碼需要重復(fù)寫(xiě)多次,顯得代碼的結(jié)構(gòu)臃腫,形成代碼冗余。
   3、非核心類(代理類)需要實(shí)現(xiàn)核心類(被代理類)實(shí)現(xiàn)的接口,也就是他們需要實(shí)現(xiàn)共同的接口,但是以核心類實(shí)現(xiàn)的接口(被代理類)為準(zhǔn)。

l目地是將業(yè)務(wù)代碼與日志代碼完全分離,實(shí)現(xiàn)松散耦合.

l代理對(duì)象與被代理對(duì)象必須實(shí)現(xiàn)同一接口,在代理對(duì)象中實(shí)現(xiàn)與日志記錄的相關(guān)服務(wù),并在需要的時(shí)候呼叫被代理對(duì)象,而被代理對(duì)象只保留業(yè)務(wù)代碼.

靜態(tài)代理的實(shí)現(xiàn)

1)定義接口:

?
1
2
3
4
public interface iperson {
    public abstract void sleep();
    public abstract void eating();
}

2) 被代理類

?
1
2
3
4
5
6
7
8
public class person implements iperson {
    public void sleep(){
        system.out.println("睡覺(jué)中");
    }
    public void eating(){
        system.out.println("正在吃飯中");
    }
}

3) 代理類

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import org.apache.log4j.logger;
public class personproxy implements iperson {
    private iperson person;
    private logger logger = logger.getlogger(personproxy.class);
    public personproxy(iperson person) {
        this.person = person;
    }
    public void eating() {
        logger.info("開(kāi)始執(zhí)行時(shí)間:“ + new date()");
        person.eating();
        logger.info("“執(zhí)行結(jié)束時(shí)間:” + new date()");
    }
    public void sleep() {
        logger.info("開(kāi)始執(zhí)行時(shí)間:“ + new date()");
        person.sleep();
        logger.info("“執(zhí)行結(jié)束時(shí)間:” + new date()");
    }
}

4) 測(cè)試類

?
1
2
3
4
5
6
7
8
package com.aptech.aop2;
public class persontest {
    public static void main(string[] args) {
        iperson proxy = new personproxy(new person());
        proxy.eating();
        proxy.sleep();
    }
}

靜態(tài)代理的弊端:

一個(gè)代理接口只能服務(wù)于一種類型的對(duì)象.對(duì)于稍大點(diǎn)的項(xiàng)目根本無(wú)法勝任.

3 解決方案2-動(dòng)態(tài)代理

invocationhandler:每一個(gè)動(dòng)態(tài)代理類都必須實(shí)現(xiàn)invocationhandler這個(gè)接口,并且每個(gè)代理類的實(shí)例都關(guān)聯(lián)到了一個(gè)handler,當(dāng)我們通過(guò)代理對(duì)象調(diào)用一個(gè)方法的時(shí)候,這個(gè)方法的調(diào)用就會(huì)被轉(zhuǎn)發(fā)為由invocationhandler這個(gè)接口的invoke方法來(lái)進(jìn)行調(diào)用。

在jdk1.3之后加入了可協(xié)助開(kāi)發(fā)的動(dòng)態(tài)代理功能.不必為特定對(duì)象與方法編寫(xiě)特定的代理對(duì)象,使用動(dòng)態(tài)代理,可以使得一個(gè)處理者(handler)服務(wù)于各個(gè)對(duì)象.
一個(gè)處理者的類設(shè)計(jì)必須實(shí)現(xiàn)java.lang.reflect.invocationhandler接口.
通過(guò)invocationhandler接口實(shí)現(xiàn)的動(dòng)態(tài)代理只能代理接口的實(shí)現(xiàn)類.

動(dòng)態(tài)代理實(shí)現(xiàn)

1) 處理者(handler)

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class dynaproxyhandler implements invocationhandler {
    private logger logger = logger.getlogger(dynaproxyhandler.class);
    private object target;
    //被代理對(duì)象
    public void settarget(object target) {
        this.target = target;
    }
    public object invoke(object proxy, method method, object[] args)
                  throws throwable {
        logger.info("執(zhí)行開(kāi)始時(shí)間:" + new date());
        object result = method.invoke(target, args);
        logger.info("執(zhí)行結(jié)束時(shí)間:" + new date());
        return result;
        //返回method執(zhí)行結(jié)果
    }
}

2) 生產(chǎn)代理對(duì)象的工廠

?
1
2
3
4
5
6
7
8
9
import java.lang.reflect.proxy;
public class dynaproxyfactory {
    //obj為被代理對(duì)象
    public static object getproxy(object obj){
        dynaproxyhandler handler = new dynaproxyhandler();
        handler.settarget(obj);
        return proxy.newproxyinstance(obj.getclass().getclassloader(), obj.getclass().getinterfaces(), handler);
    }
}

3) 測(cè)試類

?
1
2
3
4
5
6
7
8
public class persontest {
    public static void main(string[] args) {
        iperson person = (iperson) dynaproxyfactory.getproxy(new person());
        //返回代理類,代理類是jvm在內(nèi)存中動(dòng)態(tài)創(chuàng)建的,該類實(shí)現(xiàn)傳入的接口數(shù)組的全部接口(的全部方法).
        person.eating();
        person.sleep();
    }
}

總結(jié)

以上就是本文關(guān)于spring靜態(tài)代理和動(dòng)態(tài)代理代碼詳解的全部?jī)?nèi)容,希望對(duì)大家有所幫助。如有不足之處,歡迎留言指出。感謝朋友們對(duì)本站的支持!

原文鏈接:https://www.cnblogs.com/zhouyeqin/p/7208367.html

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 美女扒开腿让男生桶爽网站 | 欧美 国产 亚洲 卡通 综合 | 一区二区三区在线观看国产 | 色综合精品 | 一级毛片在线观看视频 | 久久69精品久久久久久国产越南 | 久草视频在线看 | 久久久成人免费视频 | a免费视频 | 国产91在线高潮白浆在线观看 | 欧美 日韩 亚洲 中文 | 免费在线观看成人网 | 欧美爱爱一区二区 | 日韩精品久久久久久 | 亚洲成人中文字幕在线 | 爽成人777777婷婷 | 国产成人免费精品 | 久久精品一区二区三区四区五区 | 中文字幕天堂在线 | 精品在线观看一区 | 美女毛片儿 | 欧美一级黄色录像片 | 日日做夜夜爱 | 亚洲国产网址 | h色视频网站 | 久久精品日韩一区 | 在线亚州| 久国久产久精永久网页 | 亚洲爱爱网站 | 亚洲啪 | 黄网站进入 | 1区2区3区在线观看 欧美特黄a | 久久免费视频3 | 91久久国产露脸精品国产护士 | 亚洲精品 在线播放 | 国产午夜精品在线 | 韩国十九禁高潮床戏在线观看 | 免费毛片随便看 | 美女黄视频在线观看 | 欧美18xxxx| 国产午夜免费福利 |