摘要:面向切面編程的目標(biāo)就是分離關(guān)注點(diǎn)。不會(huì)出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染。線程不安全就是不提供數(shù)據(jù)訪問保護(hù),有可能出現(xiàn)多個(gè)線程先后更改數(shù)據(jù)造成所得到的數(shù)據(jù)是臟數(shù)據(jù)和區(qū)別是的輕量級(jí)實(shí)現(xiàn)非線程安全的實(shí)現(xiàn)
spingmvc 和 structs的區(qū)別
我們用struts2時(shí)采用的傳統(tǒng)的配置文件的方式,并沒有使用傳說中的0配置。 spring3 mvc可以認(rèn)為已經(jīng)100%零配置了(除了配置spring mvc-servlet.xml外)。 Spring MVC和Struts2的區(qū)別: 1. 機(jī)制:spring mvc的入口是servlet,而struts2是filter(這里要指出,filter和servlet是不同的。以前認(rèn)為filter是servlet的一種特殊),這樣就導(dǎo)致了二者的機(jī)制不同,這里就牽涉到servlet和filter的區(qū)別了。 2. 性能:spring會(huì)稍微比struts快。spring mvc是基于方法的設(shè)計(jì),而sturts是基于類,每次發(fā)一次請(qǐng)求都會(huì)實(shí)例一個(gè)action,每個(gè)action都會(huì)被注入屬性. 而spring基于方法,粒度更細(xì),但要小心把握像在servlet控制數(shù)據(jù)一樣。spring3 mvc是方法級(jí)別的攔截,攔截到方法后根據(jù)參數(shù)上的注解,把request數(shù)據(jù)注入進(jìn)去,在spring3 mvc中,一個(gè)方法對(duì)應(yīng)一個(gè)request上下文。 而struts2框架是類級(jí)別的攔截,每次來了請(qǐng)求就創(chuàng)建一個(gè)Action,然后調(diào)用setter getter方法把request中的數(shù)據(jù)注入;struts2實(shí)際上是通過setter getter方法與request打交道的;struts2中,一個(gè)Action對(duì)象對(duì)應(yīng)一個(gè)request上下文。 3. 參數(shù)傳遞:struts是在接受參數(shù)的時(shí)候,可以用屬性來接受參數(shù),這就說明參數(shù)是讓多個(gè)方法共享的。 4. 設(shè)計(jì)思想上:struts更加符合oop的編程思想, spring就比較謹(jǐn)慎,在servlet上擴(kuò)展。 5. intercepter的實(shí)現(xiàn)機(jī)制:struts有以自己的interceptor機(jī)制,spring mvc用的是獨(dú)立的AOP方式。這樣導(dǎo)致struts的配置文件量還是比spring mvc大,雖然struts的配置能繼承,所以我覺得論使用上來講,spring mvc使用更加簡(jiǎn)潔,開發(fā)效率Spring MVC確實(shí)比struts2高。 spring mvc是方法級(jí)別的攔截,一個(gè)方法對(duì)應(yīng)一個(gè)request上下文,而方法同時(shí)又跟一個(gè)url對(duì)應(yīng),所以說從架構(gòu)本身上spring3 mvc就容易實(shí)現(xiàn)restful url。 struts2是類級(jí)別的攔截,一個(gè)類對(duì)應(yīng)一個(gè)request上下文;實(shí)現(xiàn)restful url要費(fèi)勁,因?yàn)閟truts2 action的一個(gè)方法可以對(duì)應(yīng)一個(gè)url;而其類屬性卻被所有方法共享,這也就無法用注解或其他方式標(biāo)識(shí)其所屬方法了。 spring3 mvc的方法之間基本上獨(dú)立的,獨(dú)享request response數(shù)據(jù),請(qǐng)求數(shù)據(jù)通過參數(shù)獲取,處理結(jié)果通過ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間也是獨(dú)立的,但其所有Action變量是共享的,這不會(huì)影響程序運(yùn)行,卻給我們編碼,讀程序時(shí)帶來麻煩。 6. 另外,spring3 mvc的驗(yàn)證也是一個(gè)亮點(diǎn),支持JSR303,處理ajax的請(qǐng)求更是方便,只需一個(gè)注解@ResponseBody ,然后直接返回響應(yīng)文本即可。IOC
IOC(Inverse of Control):控制反轉(zhuǎn),也可以稱為依賴倒置。 所謂依賴,從程序的角度看,就是比如A要調(diào)用B的方法,那么A就依賴于B,反正A要用到B,則A依賴于B。所謂倒置,你必須理解如果不倒置,會(huì)怎么著,因?yàn)锳必須要有B,才可以調(diào)用B, 如果不倒置,意思就是A主動(dòng)獲取B的實(shí)例:B b = new B(),這就是最簡(jiǎn)單的獲取B實(shí)例的方法(當(dāng)然還有各種設(shè)計(jì)模式可以幫助你去獲得B的實(shí)例,比如工廠、Locator等等),然后你就可以調(diào)用b對(duì)象了。 所以,不倒置,意味著A要主動(dòng)獲取B,才能使用B;到了這里,就應(yīng)該明白了倒置的意思了。倒置就是A要調(diào)用B的話,A并不需要主動(dòng)獲取B,而是由其它人自動(dòng)將B送上門來。 形象的舉例就是: 通常情況下,假如你有一天在家里口渴了,要喝水,那么你可以到你小區(qū)的小賣部去,告訴他們,你需要一瓶水,然后小賣部給你一瓶水!這本來沒有太大問題, 關(guān)鍵是如果小賣部很遠(yuǎn),那么你必須知道:從你家如何到小賣部;小賣部里是否有你需要的水;你還要考慮是否開著車去;等等等等,也許有太多的問題要考慮了。 也就是說,為了一瓶水,你還可能需要依賴于車等等這些交通工具或別的工具,問題是不是變得復(fù)雜了?那么如何解決這個(gè)問題呢? 解決這個(gè)問題的方法很簡(jiǎn)單:小賣部提供送貨上門服務(wù),凡是小賣部的會(huì)員,你只要告知小賣部你需要什么,小賣部將主動(dòng)把貨物給你送上門來!這樣一來,你只需要做兩件事情,你就可以活得更加輕松自在: 第一:向小賣部注冊(cè)為會(huì)員。 第二:告訴小賣部你需要什么。AOP
面向切面編程的目標(biāo)就是分離關(guān)注點(diǎn)。什么是關(guān)注點(diǎn)呢?就是你要做的事,就是關(guān)點(diǎn)。假如你是個(gè)公子哥,沒啥人生目標(biāo),天天就是衣來伸手,飯來張口,整天只知道玩一件事!那么,每天你一睜眼,就光想著吃完飯就去玩(你必須要做的事), 但是在玩之前,你還需要穿衣服、穿鞋子、疊好被子、做飯等等等等事情,這些事情就是你的關(guān)注點(diǎn),但是你只想吃飯然后玩,那么怎么辦呢?這些事情通通交給別人去干。在你走到飯桌之前,有一個(gè)專門的仆人A幫你穿衣服,仆人B幫你穿鞋子,仆人C幫你疊好被子,仆人C幫你做飯,然后你就開始吃飯、去玩(這就是你一天的正事),你干完你的正事之后,回來,然后一系列仆人又開始幫你干這個(gè)干那個(gè),然后一天就結(jié)束了! AOP的好處就是你只需要干你的正事,其它事情別人幫你干。也許有一天,你想裸奔,不想穿衣服,那么你把仆人A解雇就是了!也許有一天,出門之前你還想帶點(diǎn)錢,那么你再雇一個(gè)仆人D專門幫你干取錢的活!這就是AOP。每個(gè)人各司其職,靈活組合,達(dá)到一種可配置的、可插拔的程序結(jié)構(gòu)。 從Spring的角度看,AOP最大的用途就在于提供了事務(wù)管理的能力。事務(wù)管理就是一個(gè)關(guān)注點(diǎn),你的正事就是去訪問數(shù)據(jù)庫(kù),而你不想管事務(wù)(太煩),所以,Spring在你訪問數(shù)據(jù)庫(kù)之前,自動(dòng)幫你開啟事務(wù),當(dāng)你訪問數(shù)據(jù)庫(kù)結(jié)束之后,自動(dòng)幫你提交/回滾事務(wù)!Spring 事務(wù)管理
Spring配置文件中關(guān)于事務(wù)配置總是由三個(gè)組成部分,分別是DataSource,TransactionManager和代理機(jī)制這三部分,無論哪種配置方式,一般變化的只是代理機(jī)制這部分。緩存技術(shù)
可做緩存的技術(shù),Ehcache, Linkedhashmap, Memcached, Redis,視需求而定 LinkedHashMap 和Ehcache都是單機(jī)緩存技術(shù),即只能在一個(gè)應(yīng)用內(nèi)實(shí)現(xiàn)緩存, 不能實(shí)現(xiàn)多臺(tái)機(jī)器使用相同的緩存區(qū)域(分布式緩存) LinkedHashMap的底層是用HashMap實(shí)現(xiàn)的,特點(diǎn)元素的排序是按鏈表方式 排序,按寫入或輸出的順序排序,最后一次寫入或讀取的元素放到最后 LinkedHashMap 只是一個(gè)JDK自帶的類,而Ehcache是一個(gè)外部jar包,是Java領(lǐng)域常用的緩存框架, 鼎鼎大名的hibernate都是用Ehcache,但ehcache也可用使用某些技術(shù)支持在群集環(huán)境中使用 Memcached是分布式緩存技術(shù),需要獨(dú)立部署,使多臺(tái)機(jī)器 可以使用同一個(gè)緩存服務(wù)器,實(shí)現(xiàn)集群的緩存共享。 Redis同樣是分布式緩存技術(shù),比Memcached更新,支持的數(shù)據(jù)類型更多,使用更方便,最 重要的是:Memcached的數(shù)據(jù)只能存在內(nèi)存中,重啟后即消失,而Redis可以持久化,因此 Redis可以作為一個(gè)NoSql數(shù)據(jù)庫(kù)使用。如果沒有歷史遺留系統(tǒng),初次引入緩存框架,建議用redis反射機(jī)制
反射機(jī)制其實(shí)就是指程序在運(yùn)行的時(shí)候能夠獲取自身的信息。 如果知道一個(gè)類的名稱/或者它的一個(gè)實(shí)例對(duì)象,就能把這個(gè)類的所有方法和 變量的信息(方法名,變量名,方法,修飾符,類型,方法參數(shù)等等所有信息)找出來。 如果明確知道這個(gè)類里的某個(gè)方法名+參數(shù)個(gè)數(shù) 類型,還能通過傳遞參數(shù)來運(yùn)行那個(gè)類里的那個(gè)方法,這就是反射。優(yōu)缺點(diǎn)
反射的優(yōu)點(diǎn)當(dāng)然是體現(xiàn)在它的動(dòng)態(tài)性上面,能運(yùn)行時(shí)確定類型,綁定對(duì)象。 動(dòng)態(tài)編譯最大限度發(fā)揮了java的靈活性,體現(xiàn)了多態(tài)的應(yīng)用, 降低類之間的藕合性。 一句話,反射機(jī)制的優(yōu)點(diǎn)就是可以實(shí)現(xiàn)動(dòng)態(tài)創(chuàng)建對(duì)象和編譯, 特別是在J2EE的開發(fā)中,它的靈活性就表現(xiàn)的十分明顯。比如,一個(gè)大型的軟件,不可能一次就把 它設(shè)計(jì)的很完美, 當(dāng)這個(gè)程序編譯后,發(fā)布了,當(dāng)發(fā)現(xiàn)需要更新某些功能時(shí),我們不可能要用戶把以前的卸載, 再重新安裝新的版本,假如這樣的話,這個(gè)軟件肯定 是沒有多少人用的。 采用靜態(tài)的話,需要把整個(gè)程序重新編譯一次才可以實(shí)現(xiàn)功能的更新,而采用反射機(jī)制的話,它就可以不用卸載, 只需要在運(yùn)行時(shí)才動(dòng)態(tài)的創(chuàng)建 和編譯,就可以實(shí)現(xiàn)該功能。 它的缺點(diǎn)是對(duì)性能有影響。使用反射基本上是一種解釋操作, 我們可以告訴JVM,我們希望做什么并且它滿足我們的要求。這類操作總是慢于只直接執(zhí)行相同的操作Collection Map
Collection Map Collection ? ? -----List List接口中的對(duì)象按一定順序排列,允許重復(fù) ????????????? ?-----LinkedList ? ?非同步 ????????????? ? ----ArrayList ? ? ?非同步,實(shí)現(xiàn)了可變大小的元素?cái)?shù)組 ????????????? ? ----Vector ? ? ? ? ?同步 線程安全 ?????????????????????????------Stack ? ? -----Set ? 不允許有相同的元素 Set接口中的對(duì)象沒有順序,但是不允許重復(fù) Map Map接口中的對(duì)象是key、value的映射關(guān)系,key不允許重復(fù) ? ? -----HashTable????? ? 同步,實(shí)現(xiàn)一個(gè)key--value映射的哈希表 線程安全 ? ? -----HashMap ? ? ? ? ?非同步, ? ? -----WeakHashMap ? 改進(jìn)的HashMap,實(shí)現(xiàn)了“弱引用”,如果一個(gè)key不被引用,則被GC回收 ? ?線程安全和線程不安全
線程安全就是多線程訪問時(shí),采用了加鎖機(jī)制,當(dāng)一個(gè)線程訪問該類的某個(gè)數(shù)據(jù)時(shí),進(jìn)行保護(hù), 其他線程不能進(jìn)行訪問直到該線程讀取完,其他線程才可使用。不會(huì)出現(xiàn)數(shù)據(jù)不一致或者數(shù)據(jù)污染。 線程不安全就是不提供數(shù)據(jù)訪問保護(hù),有可能出現(xiàn)多個(gè)線程先后更改數(shù)據(jù) 造成所得到的數(shù)據(jù)是臟數(shù)據(jù)hashMap和hashTable區(qū)別
HashMap是Hashtable的輕量級(jí)實(shí)現(xiàn)(非線程安全的實(shí)現(xiàn)),他們都完成了Map接口, 主要區(qū)別在于HashMap允許空(null)鍵值(key),由于非線程安全,效率上可能高于Hashtable。 HashMap允許將null作為一個(gè)entry的key或者value,而Hashtable不允許。 HashMap把Hashtable的contains方法去掉了,改成containsvalue和containsKey。 因?yàn)閏ontains方法容易讓人引起誤解。 Hashtable繼承自Dictionary類,而HashMap是Java1.2引進(jìn)的Map interface的一個(gè)實(shí)現(xiàn)。 最大的不同是,Hashtable的方法是Synchronize的,而HashMap不是,在多個(gè)線程訪問Hashtable時(shí),不需要 自己為它的方法實(shí)現(xiàn)同步,而HashMap 就必須為之提供外同步(Collections.synchronizedMap)。 Hashtable和HashMap采用的hash/rehash算法都大概一樣,所以性能不會(huì)有很大的差異。接口和抽象類
1.語(yǔ)法層面上的區(qū)別
1)抽象類可以提供成員方法的實(shí)現(xiàn)細(xì)節(jié),而接口中只能存在public abstract 方法和屬性;
2)抽象類中的成員變量可以是各種類型的,而接口中的成員變量只能是public static final類型的;
3)接口中不能含有靜態(tài)代碼塊以及靜態(tài)方法,而抽象類可以有靜態(tài)代碼塊和靜態(tài)方法;
4)一個(gè)類只能繼承一個(gè)抽象類,而一個(gè)類卻可以實(shí)現(xiàn)多個(gè)接口。
2.設(shè)計(jì)層面上的區(qū)別
1)抽象類是對(duì)一種事物的抽象,即對(duì)類抽象,而接口是對(duì)行為的抽象。抽象類是對(duì)整個(gè)類整體進(jìn)行抽象,包括屬性、行為,但是接口卻是對(duì)類局部(行為)進(jìn)行抽象。舉個(gè)簡(jiǎn)單的例子,飛機(jī)和鳥是不同類的事物,但是它們都有一個(gè)共性,就是都會(huì)飛。那么在設(shè)計(jì)的時(shí)候,可以將飛機(jī)設(shè)計(jì)為一個(gè)類Airplane,將鳥設(shè)計(jì)為一個(gè)類Bird,但是不能將 飛行 這個(gè)特性也設(shè)計(jì)為類,因此它只是一個(gè)行為特性,并不是對(duì)一類事物的抽象描述。此時(shí)可以將 飛行 設(shè)計(jì)為一個(gè)接口Fly,包含方法fly( ),然后Airplane和Bird分別根據(jù)自己的需要實(shí)現(xiàn)Fly這個(gè)接口。然后至于有不同種類的飛機(jī),比如戰(zhàn)斗機(jī)、民用飛機(jī)等直接繼承Airplane即可,對(duì)于鳥也是類似的,不同種類的鳥直接繼承Bird類即可。從這里可以看出,繼承是一個(gè) "是不是"的關(guān)系,而 接口 實(shí)現(xiàn)則是 "有沒有"的關(guān)系。如果一個(gè)類繼承了某個(gè)抽象類,則子類必定是抽象類的種類,而接口實(shí)現(xiàn)則是有沒有、具備不具備的關(guān)系,比如鳥是否能飛(或者是否具備飛行這個(gè)特點(diǎn)),能飛行則可以實(shí)現(xiàn)這個(gè)接口,不能飛行就不實(shí)現(xiàn)這個(gè)接口。
2)設(shè)計(jì)層面不同,抽象類作為很多子類的父類,它是一種模板式設(shè)計(jì)。而接口是一種行為規(guī)范,它是一種輻射式設(shè)計(jì)。什么是模板式設(shè)計(jì)?最簡(jiǎn)單例子,大家都用過ppt里面的模板,如果用模板A設(shè)計(jì)了ppt B和ppt C,ppt B和ppt C公共的部分就是模板A了,如果它們的公共部分需要改動(dòng),則只需要改動(dòng)模板A就可以了,不需要重新對(duì)ppt B和ppt C進(jìn)行改動(dòng)。而輻射式設(shè)計(jì),比如某個(gè)電梯都裝了某種報(bào)警器,一旦要更新報(bào)警器,就必須全部更新。也就是說對(duì)于抽象類,如果需要添加新的方法,可以直接在抽象類中添加具體的實(shí)現(xiàn),子類可以不進(jìn)行變更;而對(duì)于接口則不行,如果接口進(jìn)行了變更,則所有實(shí)現(xiàn)這個(gè)接口的類都必須進(jìn)行相應(yīng)的改動(dòng)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/65206.html
摘要:好不容易在月號(hào)這天中午點(diǎn)左右接到了來自阿里的面試電話。這里會(huì)不斷收集和更新基礎(chǔ)相關(guān)的面試題,目前已收集題。面試重難點(diǎn)的和的打包過程多線程機(jī)制機(jī)制系統(tǒng)啟動(dòng)過程,啟動(dòng)過程等等掃清面試障礙最新面試經(jīng)驗(yàn)分享,此為第一篇,開篇。 2016 年末,騰訊,百度,華為,搜狗和滴滴面試題匯總 2016 年未,騰訊,百度,華為,搜狗和滴滴面試題匯總 各大公司 Java 后端開發(fā)面試題總結(jié) 各大公司 Jav...
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語(yǔ)言和等其他語(yǔ)言的對(duì)比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語(yǔ)言和Java、python等其他語(yǔ)言的對(duì)比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
摘要:作為面試官,我是如何甄別應(yīng)聘者的包裝程度語(yǔ)言和等其他語(yǔ)言的對(duì)比分析和主從復(fù)制的原理詳解和持久化的原理是什么面試中經(jīng)常被問到的持久化與恢復(fù)實(shí)現(xiàn)故障恢復(fù)自動(dòng)化詳解哨兵技術(shù)查漏補(bǔ)缺最易錯(cuò)過的技術(shù)要點(diǎn)大掃盲意外宕機(jī)不難解決,但你真的懂?dāng)?shù)據(jù)恢復(fù)嗎每秒 作為面試官,我是如何甄別應(yīng)聘者的包裝程度Go語(yǔ)言和Java、python等其他語(yǔ)言的對(duì)比分析 Redis和MySQL Redis:主從復(fù)制的原理詳...
摘要:一基礎(chǔ)接口的意義百度規(guī)范擴(kuò)展回調(diào)抽象類的意義想不想通過一線互聯(lián)網(wǎng)公司面試文檔整理為電子書掘金簡(jiǎn)介谷歌求職記我花了八個(gè)月準(zhǔn)備谷歌面試掘金原文鏈接翻譯者 【面試寶典】從對(duì)象深入分析 Java 中實(shí)例變量和類變量的區(qū)別 - 掘金原創(chuàng)文章,轉(zhuǎn)載請(qǐng)務(wù)必保留原出處為:http://www.54tianzhisheng.cn/... , 歡迎訪問我的站點(diǎn),閱讀更多有深度的文章。 實(shí)例變量 和 類變量...
閱讀 3514·2023-04-25 17:35
閱讀 2587·2021-11-24 09:39
閱讀 2525·2021-10-18 13:32
閱讀 3409·2021-10-11 10:58
閱讀 1630·2021-09-26 09:55
閱讀 6134·2021-09-22 15:47
閱讀 959·2021-08-26 14:15
閱讀 3466·2019-08-30 15:55