freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

ioc和aop的概念解決層與層之間的依賴關(guān)系以及重復(fù)業(yè)務(wù)的處理畢業(yè)設(shè)計(jì)論文正文-文庫(kù)吧

2025-04-21 19:20 本頁(yè)面


【正文】 對(duì)于注解,主要作用大致是監(jiān)測(cè)代碼依賴性,創(chuàng)建文檔,通過(guò)注解甚至可以執(zhí)行基礎(chǔ)的編譯檢查 。 [10]注解的編寫(xiě)方式是以“ @”開(kāi)頭加上自定義的注解名,通過(guò)其參數(shù)個(gè)數(shù)的不同,大致可分為三類:?jiǎn)沃底⒔?、?biāo)記注解和完整注解 。 注解只是作為標(biāo)識(shí)存在,一般不會(huì)直接影響到程序的語(yǔ)義,通過(guò)反射機(jī)制我們可以訪問(wèn)到這些元數(shù)據(jù), 元數(shù)據(jù)就是用來(lái)描述數(shù)據(jù)的數(shù)據(jù) 。 本科畢業(yè)設(shè)計(jì)說(shuō)明書(shū)(論文) 第 7 頁(yè) 共 28 頁(yè) 注解的存在級(jí)別一共有三種: RUNTIME,CLASS,SOURCE。 RUNTIME 表示運(yùn)行時(shí)存在, CLASS表示能作用于 class 文件, SOURCE 表示只存在源代碼中。程序員可在編譯時(shí)選擇代碼的存在級(jí)別。 [11] 基本作用 雖然對(duì)于注解的作用還沒(méi)有明確的定義,但是大致可以分為三種: ( 1) 編寫(xiě)文檔: 檢查代碼中存在的標(biāo)識(shí)注解來(lái)生成文檔 。 ( 2) 代碼分析: 以代碼中標(biāo)識(shí)的注解對(duì)代碼進(jìn)行分析 。 ( 3) 編譯檢查: 檢查標(biāo)識(shí)的注解使編譯器能執(zhí)行基礎(chǔ)的編譯檢查 。 [12] 基本的內(nèi)置注解 ( 1) @Override:只 能用在方法上,用來(lái)申明該方法是改寫(xiě)父類的。 ( 2) @Deprecated: 對(duì)于棄用的方法添加的注解。當(dāng)程序員調(diào)用這些方法時(shí), 在編譯時(shí)將會(huì)顯示提示信息。該注解可添加在程序的所有元素上。 ( 3) @SuperressWarnings:暫時(shí)關(guān)閉警告信息。 [13] 3 基于注解的 IoC 和 AOP 的實(shí)現(xiàn) 就 IoC 而言, 主要實(shí)現(xiàn)是靠設(shè)計(jì)模式中的工廠模式,工廠模式負(fù)責(zé)將大量具有Component 注解的類進(jìn)行實(shí)例化,而不必事先知道每次是要實(shí)例化哪一個(gè)類。 換句話說(shuō),工廠模式對(duì)于具體的 new的細(xì)節(jié)都進(jìn)行了隱藏和封裝 。 對(duì)于工廠模式的優(yōu)點(diǎn) 主要分為下列四點(diǎn) : ( 1) 代碼結(jié)構(gòu)清晰,具有良好的封裝性 。 對(duì)于對(duì)象的創(chuàng)建不是無(wú)條件的。假設(shè)一個(gè)調(diào)用者需要一個(gè)具體的產(chǎn)品,調(diào)用者并不需要知道產(chǎn)品具體是如何被生產(chǎn)的。對(duì)于他而言只需要知道產(chǎn)品類名或者產(chǎn)品約束字符串就可以了,從而降低模塊耦合度 。 ( 2) 優(yōu)秀的可擴(kuò)展性。 如果具體需求需要增加產(chǎn)品,不必具體對(duì)產(chǎn)品類進(jìn)行修改,只需適當(dāng)修改工廠類或者再增加一個(gè)工廠就可以了 。 ( 3) 屏蔽產(chǎn)品類。 對(duì)于具體產(chǎn)品是如何生產(chǎn)的,調(diào)用者并不用關(guān)心,他的關(guān)注點(diǎn)主要在于產(chǎn)品的接口。如果產(chǎn)品接口不發(fā)生變化,那么系統(tǒng)上層的模塊也不會(huì)發(fā)生改變 。 具體的產(chǎn)品的實(shí)例化 主要由工廠類管理,對(duì)于 不同的產(chǎn)品對(duì)象的生產(chǎn)應(yīng)取決于不同的工廠類 。 ( 4) 關(guān)于工廠方法的經(jīng)典應(yīng)用就是解耦合了 。 處于較高層的模塊只需知道實(shí)現(xiàn) 本科畢業(yè)設(shè)計(jì)說(shuō)明書(shū)(論文) 第 8 頁(yè) 共 28 頁(yè) 類的接口,具體實(shí)現(xiàn)類無(wú)需關(guān)心 。 對(duì)于工廠方法,它也遵循迪米特和依賴倒置法則,僅僅依賴實(shí)現(xiàn)類的接口 ; 除此之外,工廠方法也遵循里氏替換原則,子類可以隨時(shí)隨地替換父類 。 [14] 而對(duì)于 AOP 來(lái)說(shuō),在掃描系統(tǒng)組件時(shí),如果該組件存在 Interception 注解且已聲明需要攔截的方法。那么在調(diào)用存在 Interception 注解的類的方法時(shí),如果該方法已被攔截,則該方法執(zhí)行前和執(zhí)行后會(huì)進(jìn)行相應(yīng)的 操作。而實(shí)現(xiàn) AOP 技術(shù)主要用到了代理模式。 對(duì)于使用代理模式,只要有點(diǎn)體現(xiàn)在以下幾個(gè)方面: ( 1) 職責(zé)清晰: 具體的產(chǎn)品類實(shí)現(xiàn)具體的業(yè)務(wù),不必去在意非自身所要實(shí)現(xiàn)的業(yè)務(wù)。如需其他業(yè)務(wù)可通過(guò)后期代理完成附加,此種做法的好處是代碼簡(jiǎn)潔清晰 。 ( 2) 高擴(kuò)展性: 對(duì)于產(chǎn)品類可能需求不同,但是只要是實(shí)現(xiàn)了其接口的,可通過(guò)代理手段代理各種產(chǎn)品類,而代理類卻不用做任何修改 。 ( 3) 智能化: 代理對(duì)象可在運(yùn)行時(shí)才去調(diào)用具體的代理類,換言之就是代理類可以在運(yùn)行時(shí)才確定代理對(duì)象 。 [15] 注解的編寫(xiě) 在本文中,主要用到的注解有 @Component, @Property, @Aspect, @Interception。@Component 注解主要說(shuō)明該類是一個(gè)組件 ,用于在初始化容器時(shí) 將其實(shí)例創(chuàng)建放入一個(gè) Map 中; @Property 注解主要說(shuō)明該類是組件類的屬性,在運(yùn)行時(shí)將注入屬性,以便調(diào)用該類的方法; @Aspect 注解主要用于說(shuō)明該類是一個(gè)切面類,用來(lái)執(zhí)行在攔截方法執(zhí)行過(guò)程中要處理的操作; @Interception 注解用于說(shuō)明該類中的方法需要被攔截,可指定要攔截的方法,攔截 下來(lái)的方法將先進(jìn)行其他操作,如事務(wù)處理。 具體注解的代碼如下: @Component 注解 : public @interface Component { //組件在 HashTable中的名字,當(dāng)為空時(shí)默認(rèn)為組件類名的小寫(xiě) public String name() default 。 //組件是否存在單例,默認(rèn)為存在 public boolean isSingleton() default true。 } @Property 注解: 本科畢業(yè)設(shè)計(jì)說(shuō)明書(shū)(論文) 第 9 頁(yè) 共 28 頁(yè) public @interface Property { //需要注入的屬性注入的對(duì)象的名稱,默認(rèn)為空時(shí)則直接獲取組件中屬性的名稱 public String ref() default 。 } @Aspect 注解: public @interface Aspect { //切面類的名稱 public String name() default 。 } @Interception 注解: public @interface Interception { //攔截的方法 public String[]methods()。 } IoC實(shí)現(xiàn)(對(duì)象工廠) 首先,在工廠初始化的時(shí)候會(huì)創(chuàng)建組件的對(duì)象,而對(duì)于組件類的存放放在對(duì)應(yīng)的包中,對(duì)于讀 取的包及包的掃描則配置在 XML 中。讀取 XML 獲取包名及子包名代碼如下: String packageInfo=。 URL url=()。 File file=new File(()+xmlName)。 DocumentBuilder builder=null。 try { builder=().newDocumentBuilder()。 Document doc=(file)。 Element ele=()。 NodeList nls=()。 Element ce=null。 for (int i = 0。 i ()。 i++) { Node n=(i)。 if(()==){ if(().equals(ponentpackage)){ ce=(Element)n。 break。 } } } packageInfo=()。 } catch (Exception e) { ()。 本科畢業(yè)設(shè)計(jì)說(shuō)明書(shū)(論文) 第 10 頁(yè) 共 28 頁(yè) } 其次通過(guò)包名,獲取包中的所有類 ,而類的存放是以文件形式存在,則需進(jìn)行文件的掃描 。 文件掃描 代碼如下: public void findAndAddClassesInPackageByFile(String packageName, String physicsPath, final boolean recursive, SetClass? classes) { //獲取此包的目錄建立一個(gè) file File dir=new File(physicsPath)。 //如果不存在或者也不是 一個(gè)目錄就直接返回 if(!()||!()){ return。 } //如果存在就獲取包下的所有文件及目錄 File[] dirFiles=(new FileFilter() { @Override public boolean accept(File file) { //如果可以循環(huán)(即包含子目錄)或是以 .class結(jié)尾的文件(即編譯好的 java文件) return (recursiveamp。amp。())||(().endsWith(.class))。 } })。 //循環(huán)所有文件 for (File file : dirFiles) { //如果是目錄則繼續(xù)掃描 if(()){ findAndAddClassesInPackageByFile(packageName+.+(), (), recursive, classes)。 }else{ //如果是 java類文件去掉后面的 .class只留下類名 String className=().substring(0,().length()6)。 //(className)。 try { //添加到集合中 //(packageName+39。.39。+className)。 (().getContextClassLoader().loadClass(packageName+39。.39。+className))。 } catch (Exception e) { ()。 } } } } 本科畢業(yè)設(shè)計(jì)說(shuō)明書(shū)(論文) 第 11 頁(yè) 共 28 頁(yè) 獲取包中所有類的代碼如下: public SetClass?getClasses(String packages){ //存放包中的 class SetClass?classes=new LinkedHashSetClass?()。 //是否迭代循環(huán) b
點(diǎn)擊復(fù)制文檔內(nèi)容
研究報(bào)告相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1