前言:
最近整理Spring相關(guān)的知識(shí)點(diǎn)(面試必問(wèn)) ,在我整理的過(guò)程中痘系,我發(fā)現(xiàn)自己對(duì)Spring的理解有點(diǎn)朦朧,因?yàn)樵谄綍r(shí)我們接受的是Spring單個(gè)的知識(shí)點(diǎn)或者知道但沒(méi)有代碼的支持所有有點(diǎn)朦朧,所以我就把Spring知識(shí)點(diǎn)從整體然后往局部锡溯,到最后一個(gè)一個(gè)知識(shí)點(diǎn)拎出來(lái),我想有很多的朋友或者是初學(xué)的朋友和我一樣對(duì)Spring有點(diǎn)朦朧哑姚,所以我分享出來(lái)托酸,寫的不完全和不好的歡迎指出
什么是spring
spring是一個(gè)開源框架嫂侍,spring為簡(jiǎn)化企業(yè)級(jí)開發(fā)而生,使用spring可以使簡(jiǎn)單的java bean 實(shí)現(xiàn)以前只有EJG才能實(shí)現(xiàn)的功能。
Spring是一個(gè)輕量級(jí)的控制反轉(zhuǎn)(IoC)和面向切面(AOP)的容器框架揩慕。
spring的特點(diǎn)
?◆ 輕量——從大小與開銷兩方面而言Spring都是輕量的。完整的Spring框架可以在一個(gè)大小只有1MB多的JAR文件里發(fā)布冬阳。并?且Spring所需的處理開銷也是微不足道的。此外猪钮,Spring是非侵入式的:典型地,Spring應(yīng)用中的對(duì)象不依賴于Spring的特定類胆建。?
◆ 控制反轉(zhuǎn)——Spring通過(guò)一種稱作控制反轉(zhuǎn)(IoC)的技術(shù)促進(jìn)了松耦?合烤低。當(dāng)應(yīng)用了IoC,一個(gè)對(duì)象依賴的其它對(duì)象會(huì)通過(guò)被動(dòng)的方式傳遞進(jìn)來(lái)眼坏,而不是這個(gè)對(duì)象自己創(chuàng)建或者查找依賴對(duì)象拂玻。你可以認(rèn)為IoC與JNDI相反——不?是對(duì)象從容器中查找依賴,而是容器在對(duì)象初始化時(shí)不等對(duì)象請(qǐng)求就主動(dòng)將依賴傳遞給它宰译。?
◆ 面向切面——Spring提供了面向切面編程的豐富支持檐蚜,允許通過(guò)分離應(yīng)用的?業(yè)務(wù)邏輯與系統(tǒng)級(jí)服務(wù)(例如審計(jì)(auditing)和事務(wù)()管理)進(jìn)行內(nèi)聚性的開發(fā)。應(yīng)用對(duì)象只實(shí)現(xiàn)它們應(yīng)該做的——完成業(yè)務(wù)邏輯——僅此而已沿侈。它們?并不負(fù)責(zé)(甚至是意識(shí))其它的系統(tǒng)級(jí)關(guān)注點(diǎn)闯第,例如日志或事務(wù)支持。?
◆ 容器——Spring包含并管理應(yīng)用對(duì)象的配置和生命周期缀拭,在這個(gè)意義上它是?一種容器咳短,你可以配置你的每個(gè)bean如何被創(chuàng)建——基于一個(gè)可配置原型(prototype),你的bean可以創(chuàng)建一個(gè)單獨(dú)的實(shí)例或者每次需要時(shí)都生?成一個(gè)新的實(shí)例——以及它們是如何相互關(guān)聯(lián)的蛛淋。然而咙好,Spring不應(yīng)該被混同于傳統(tǒng)的重量級(jí)的EJB容器,它們經(jīng)常是龐大與笨重的褐荷,難以使用勾效。?
◆ 框架——Spring可以將簡(jiǎn)單的組件配置、組合成為復(fù)雜的應(yīng)用叛甫。在Spring中层宫,應(yīng)用對(duì)象被聲明式地組合,典型地是在一個(gè)XML文件里其监。?Spring也提供了很多基礎(chǔ)功能(事務(wù)管理萌腿、持久化框架集成等等),將應(yīng)用邏輯的開發(fā)留給了你抖苦。
Spring包括哪些內(nèi)容
?核心技術(shù)?IoC?和?AOP?
數(shù)據(jù)訪問(wèn)?(持久層解決方案)
Web層解決方案??SpringMVC?
集成?(整合其他開源框架)
?使用Spring有什么好處
◆Spring能有效地組織你的中間層對(duì)象,無(wú)論你是否選擇使用了EJB毁菱。如果你僅僅使用了Struts或其他的包含了J2EE特有APIs的?framework,你會(huì)發(fā)現(xiàn)Spring關(guān)注了遺留下的問(wèn)題睛约,鼎俘。?
◆Spring能消除在許多工程上對(duì)Singleton的過(guò)多使用。根據(jù)我的經(jīng)驗(yàn)辩涝,這是一個(gè)主要的問(wèn)題贸伐,它減少了系統(tǒng)的可測(cè)試性和面向?qū)ο筇匦浴?
◆Spring能消除使用各種各樣格式的屬性定制文件的需要,在整個(gè)應(yīng)用和工程中,可通過(guò)一種?一致的方法來(lái)進(jìn)行配置怔揩。曾經(jīng)感到迷惑捉邢,一個(gè)特定類要查找迷幻般的屬性關(guān)鍵字或系統(tǒng)屬性,為此不得不讀Javadoc乃至源編碼嗎脯丝?有了Spring,你可?很簡(jiǎn)單地看到類的JavaBean屬性伏伐。倒置控制的使用(在下面討論)幫助完成這種簡(jiǎn)化宠进。?
◆Spring能通過(guò)接口而不是類促進(jìn)好的編程習(xí)慣,減少編程代價(jià)到幾乎為零藐翎。?
◆Spring被設(shè)計(jì)為讓使用它創(chuàng)建的應(yīng)用盡可能少的依賴于他的APIs材蹬。在Spring應(yīng)用中的大多數(shù)業(yè)務(wù)對(duì)象沒(méi)有依賴于Spring。?
◆使用Spring構(gòu)建的應(yīng)用程序易于單元測(cè)試吝镣。?
◆Spring能使EJB的使用成為一個(gè)實(shí)現(xiàn)選擇,而不是應(yīng)用架構(gòu)的必然選擇堤器。你能選擇用POJOs或local?EJBs來(lái)實(shí)現(xiàn)業(yè)務(wù)接口,卻不會(huì)影響調(diào)用代碼末贾。?
◆Spring幫助你解決許多問(wèn)題而無(wú)需使用EJB闸溃。Spring能提供一種EJB的替換物,它們適于許多web應(yīng)用拱撵。例如,Spring能使用?AOP提供聲明性事務(wù)而不通過(guò)使用EJB容器辉川,如果你僅僅需要與單個(gè)的數(shù)據(jù)庫(kù)打交道,甚至不需要JTA實(shí)現(xiàn)拴测。?
■Spring為數(shù)據(jù)存取提供了一致的框架,不論是使用JDBC或O/R?mapping產(chǎn)品(如Hibernate)乓旗。?
Spring確實(shí)使你能通過(guò)最簡(jiǎn)單可行的解決辦法解決你的問(wèn)題。這些特性是有很大價(jià)值的集索。?
總結(jié)起來(lái)寸齐,Spring有如下優(yōu)點(diǎn):?
◆低侵入式設(shè)計(jì),代碼污染極低?
◆?獨(dú)立于各種應(yīng)用服務(wù)器抄谐,可以真正實(shí)現(xiàn)Write?Once,Run?Anywhere的承諾?
◆Spring的DI機(jī)制降低了業(yè)務(wù)對(duì)象替換的復(fù)雜性?
◆Spring并不完全依賴于Spring,開發(fā)者可自由選用Spring框架的部分或全部
在此我向大家推薦一個(gè)架構(gòu)學(xué)習(xí)交流群扰法。交流學(xué)習(xí)群號(hào):521353348? 里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring蛹含,MyBatis,Netty源碼分析塞颁,高并發(fā)浦箱、高性能、分布式祠锣、微服務(wù)架構(gòu)的原理酷窥,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備的知識(shí)體系伴网。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源蓬推,目前受益良多
spring中的核心類有那些,各有什么作用
BeanFactory:產(chǎn)生一個(gè)新的實(shí)例澡腾,可以實(shí)現(xiàn)單例模式?
BeanWrapper:提供統(tǒng)一的get及set方法?
ApplicationContext:提供框架的實(shí)現(xiàn)沸伏,包括BeanFactory的所有功能?
spring常用的類和接口有哪些
A:ApplicationContextAware接口?
當(dāng)一個(gè)類需要獲取ApplicationContext實(shí)例時(shí)糕珊,可以讓該類實(shí)現(xiàn)ApplicationContextAware接口。?
B:ApplicationEvent抽象類?
當(dāng)需要?jiǎng)?chuàng)建自定義事件時(shí)毅糟,可以新建一個(gè)繼承自ApplicationEvent抽象類的類红选。?
C:ApplicationListener接口?
當(dāng)需要監(jiān)聽自定義事件時(shí),可以新建一個(gè)實(shí)現(xiàn)ApplicationListener接口的類姆另,并將該類配置到Spring容器中喇肋。?
D:BeanNameAware接口?
當(dāng)bean需要獲取自身在容器中的id/name時(shí),可以實(shí)現(xiàn)BeanNameAware接口迹辐。?
E:InitializingBean接口?
當(dāng)需要在bean的全部屬性設(shè)置成功后做些特殊的處理蝶防,可以讓該bean實(shí)現(xiàn)InitializingBean接口。?
效果等同于bean的init-method屬性的使用或者@PostContsuct注解的使用右核。?
三種方式的執(zhí)行順序:先注解慧脱,然后執(zhí)行InitializingBean接口中定義的方法,最后執(zhí)行init-method屬性指定的方法贺喝。?
F:DisposableBean接口?
當(dāng)需要在bean銷毀之前做些特殊的處理菱鸥,可以讓該bean實(shí)現(xiàn)DisposableBean接口。?
效果等同于bean的destroy-method屬性的使用或者@PreDestory注解的使用躏鱼。?
三種方式的執(zhí)行順序:先注解氮采,然后執(zhí)行DisposableBean接口中定義的方法,最后執(zhí)行destroy-method屬性指定的方法染苛。?
G:BeanPostProcessor接口?
當(dāng)需要對(duì)受管bean進(jìn)行預(yù)處理時(shí)鹊漠,可以新建一個(gè)實(shí)現(xiàn)BeanPostProcessor接口的類,并將該類配置到Spring容器中茶行。?
H:BeanFactoryPostProcessor接口?
當(dāng)需要對(duì)Bean工廠進(jìn)行預(yù)處理時(shí)躯概,可以新建一個(gè)實(shí)現(xiàn)BeanFactoryPostProcessor接口的類,并將該類配置到Spring容器中畔师。?
spring事務(wù)的原理
事務(wù)管理的方式:編程型和聲明型娶靡,spring推薦使用后一種方式?
聲明型事務(wù)管理的優(yōu)勢(shì)非常明顯:代碼中無(wú)需關(guān)于關(guān)注事務(wù)邏輯,讓Spring聲明式事務(wù)管理負(fù)責(zé)事務(wù)邏輯看锉,聲明式事務(wù)管理無(wú)需與具體的事務(wù)邏輯耦?合姿锭,可以方便地在不同事務(wù)邏輯之間切換。?
什么是IOC伯铣,什么又是DI呻此,他們有什么區(qū)別
依賴注入DI是一個(gè)程序設(shè)計(jì)模式和架構(gòu)模型,?一些時(shí)候也稱作控制反轉(zhuǎn)腔寡,盡管在技術(shù)上來(lái)講焚鲜,依賴注入是一個(gè)IOC的特殊實(shí)現(xiàn),依賴注入是指一個(gè)對(duì)象應(yīng)用另外一個(gè)對(duì)象來(lái)提供一個(gè)特殊的能力,例如:把一個(gè)?數(shù)據(jù)庫(kù)連接已參數(shù)的形式傳到一個(gè)對(duì)象的結(jié)構(gòu)方法里面而不是在那個(gè)對(duì)象內(nèi)部自行創(chuàng)建一個(gè)連接恃泪≈P耍控制反轉(zhuǎn)和依賴注入的基本思想就是把類的依賴從類內(nèi)部轉(zhuǎn)化到外?部以減少依賴?
應(yīng)用控制反轉(zhuǎn),對(duì)象在被創(chuàng)建的時(shí)候贝乎,由一個(gè)調(diào)控系統(tǒng)內(nèi)所有對(duì)象的外界實(shí)體情连,將其所依賴的對(duì)象的引用,傳遞給它览效。也可以說(shuō)却舀,依賴被注入到對(duì)象中。所?以锤灿,控制反轉(zhuǎn)是挽拔,關(guān)于一個(gè)對(duì)象如何獲取他所依賴的對(duì)象的引用,這個(gè)責(zé)任的反轉(zhuǎn)但校。
Bean注入屬性的幾種方式
什么是aop螃诅,aop的作用是什么
面向切面編程(AOP)提供另外一種角度來(lái)思考程序結(jié)構(gòu),通過(guò)這種方式彌補(bǔ)了面向?qū)ο缶幊蹋∣OP)的不足状囱,除了類(classes)以外术裸,AOP提供了切面。切面對(duì)關(guān)注點(diǎn)進(jìn)行模塊化亭枷,例如橫切多個(gè)類型和對(duì)象的事務(wù)管理?
Spring的一個(gè)關(guān)鍵的組件就是AOP框架袭艺,可以自由選擇是否使用AOP?提供聲明式企業(yè)服務(wù),特別是為了替代EJB聲明式服務(wù)叨粘。最重要的服務(wù)是聲明性事務(wù)管理猾编,這個(gè)服務(wù)建立在Spring的抽象事物管理之上。允許用戶實(shí)現(xiàn)自定義切面升敲,用AOP來(lái)完善OOP的使用,可以把Spring?AOP看作是對(duì)Spring的一種增強(qiáng)?
AOP里面重要的幾個(gè)名詞概念解釋
切面(Aspect):?一個(gè)關(guān)注點(diǎn)的模塊化答倡,這個(gè)關(guān)注點(diǎn)可能會(huì)橫切多個(gè)對(duì)象。事務(wù)管理是J2EE應(yīng)用中一個(gè)關(guān)于橫切關(guān)注點(diǎn)的很好的例子驴党。?在Spring?AOP中苇羡,切面可以使用通用類(基于模式的風(fēng)格)?或者在普通類中以@Aspect注解(@AspectJ風(fēng)格)來(lái)實(shí)現(xiàn)。
連接點(diǎn)(Joinpoint):?在程序執(zhí)行過(guò)程中某個(gè)特定的點(diǎn)鼻弧,比如某方法調(diào)用的時(shí)候或者處理異常的時(shí)候。?在Spring?AOP中锦茁,一個(gè)連接點(diǎn)?總是?代表一個(gè)方法的執(zhí)行攘轩。?通過(guò)聲明一個(gè)org.aspectj.lang.JoinPoint類型的參數(shù)可以使通知(Advice)的主體部分獲得連接點(diǎn)信息。?
通知(Advice):?在切面的某個(gè)特定的連接點(diǎn)(Joinpoint)上執(zhí)行的動(dòng)作码俩。通知有各種類型度帮,其中包括“around”、“before”和“after”等通知。?通知的類型將在后面部分進(jìn)行討論笨篷。許多AOP框架瞳秽,包括Spring,都是以攔截器做通知模型率翅,?并維護(hù)一個(gè)以連接點(diǎn)為中心的攔截器鏈练俐。?
切入點(diǎn)(Pointcut):?匹配連接點(diǎn)(Joinpoint)的斷言。通知和一個(gè)切入點(diǎn)表達(dá)式關(guān)聯(lián)冕臭,并在滿足這個(gè)切入點(diǎn)的連接點(diǎn)上運(yùn)行(例如腺晾,當(dāng)執(zhí)行某個(gè)特定名稱的方法時(shí))。?切入點(diǎn)表達(dá)式如何和連接點(diǎn)匹配是AOP的核心:Spring缺省使用AspectJ切入點(diǎn)語(yǔ)法辜贵。?
引入(Introduction):?(也被稱為內(nèi)部類型聲明(inter-type?declaration))悯蝉。聲明額外的方法或者某個(gè)類型的字段。?Spring允許引入新的接口(以及一個(gè)對(duì)應(yīng)的實(shí)現(xiàn))到任何被代理的對(duì)象托慨。?例如鼻由,你可以使用一個(gè)引入來(lái)使bean實(shí)現(xiàn)?IsModified?接口,以便簡(jiǎn)化緩存機(jī)制厚棵。?
目標(biāo)對(duì)象(Target?Object):?被一個(gè)或者多個(gè)切面(aspect)所通知(advise)的對(duì)象蕉世。也有人把它叫做?被通知(advised)?對(duì)象。?既然Spring?AOP是通過(guò)運(yùn)行時(shí)代理實(shí)現(xiàn)的窟感,這個(gè)對(duì)象永遠(yuǎn)是一個(gè)?被代理(proxied)?對(duì)象讨彼。?
AOP代理(AOP?Proxy):?AOP框架創(chuàng)建的對(duì)象,用來(lái)實(shí)現(xiàn)切面契約(aspect?contract)(包括通知方法執(zhí)行等功能)柿祈。?在Spring中哈误,AOP代理可以是JDK動(dòng)態(tài)代理或者CGLIB代理。?注意:Spring?2.0最新引入的基于模式(schema-based)風(fēng)格和@AspectJ注解風(fēng)格的切面聲明躏嚎,對(duì)于使用這些風(fēng)格的用戶來(lái)說(shuō)蜜自,代理的創(chuàng)建是透明的。?
織入(Weaving):?把切面(aspect)連接到其它的應(yīng)用程序類型或者對(duì)象上卢佣,并創(chuàng)建一個(gè)被通知(advised)的對(duì)象重荠。?這些可以在編譯時(shí)(例如使用AspectJ編譯器),類加載時(shí)和運(yùn)行時(shí)完成虚茶。?Spring和其他純Java?AOP框架一樣戈鲁,在運(yùn)行時(shí)完成織入。?
通知的類型:?
前置通知(Before?advice):?在某連接點(diǎn)(join?point)之前執(zhí)行的通知嘹叫,但這個(gè)通知不能阻止連接點(diǎn)前的執(zhí)行(除非它拋出一個(gè)異常)婆殿。?
返回后通知(After?returning?advice):?在某連接點(diǎn)(join?point)正常完成后執(zhí)行的通知:例如,一個(gè)方法沒(méi)有拋出任何異常罩扇,正常返回婆芦。?
拋出異常后通知(After?throwing?advice):?在方法拋出異常退出時(shí)執(zhí)行的通知怕磨。?
后通知(After?(finally)?advice):?當(dāng)某連接點(diǎn)退出的時(shí)候執(zhí)行的通知(不論是正常返回還是異常退出)。?
環(huán)繞通知(Around?Advice):?包圍一個(gè)連接點(diǎn)(join?point)的通知消约,如方法調(diào)用肠鲫。這是最強(qiáng)大的一種通知類型。?環(huán)繞通知可以在方法調(diào)用前后完成自定義的行為或粮。它也會(huì)選擇是否繼續(xù)執(zhí)行連接點(diǎn)或直接返回它們自己的返回值或拋出異常來(lái)結(jié)束執(zhí)行导饲。?
環(huán)繞通知是最常用的一種通知類型。大部分基于攔截的AOP框架被啼,例如Nanning和JBoss4帜消,都只提供環(huán)繞通知。?
切入點(diǎn)(pointcut)和連接點(diǎn)(join?point)匹配的概念是AOP的關(guān)鍵浓体,這使得AOP不同于其它僅僅提供攔截功能的舊技術(shù)泡挺。?切入點(diǎn)使得定位通知(advice)可獨(dú)立于OO層次。?例如命浴,一個(gè)提供聲明式事務(wù)管理的around通知可以被應(yīng)用到一組橫跨多個(gè)對(duì)象中的方法上(例如服務(wù)層的所有業(yè)務(wù)操作)娄猫。?
請(qǐng)介紹一下Spring框架中Bean的生命周期和作用域?
(1)??bean定義?
在配置文件里面用來(lái)進(jìn)行定義。?
(2)??bean初始化?
有兩種方式初始化:?
A.在配置文件中通過(guò)指定init-method屬性來(lái)完成?
B.實(shí)現(xiàn)org.springframwork.beans.factory.InitializingBean接口?
(3)??bean調(diào)用?
有三種方式可以得到bean實(shí)例生闲,并進(jìn)行調(diào)用?
(4)??bean銷毀?
銷毀有兩種方式?
A.使用配置文件指定的destroy-method屬性?
B.實(shí)現(xiàn)org.springframwork.bean.factory.DisposeableBean接口?
##作用域?
singleton?
當(dāng)一個(gè)bean的作用域?yàn)閟ingleton,?那么Spring?IoC容器中只會(huì)存在一個(gè)共享的bean實(shí)例媳溺,并且所有對(duì)bean的請(qǐng)求,只要id與該bean定義相匹配碍讯,則只會(huì)返回bean的同一實(shí)例悬蔽。?
prototype?
Prototype作用域的bean會(huì)導(dǎo)致在每次對(duì)該bean請(qǐng)求(將其注入到另一個(gè)bean中,或者以程序的方式調(diào)用容器的getBean()?方法)時(shí)都會(huì)創(chuàng)建一個(gè)新的bean實(shí)例捉兴。根據(jù)經(jīng)驗(yàn)蝎困,對(duì)所有有狀態(tài)的bean應(yīng)該使用prototype作用域,而對(duì)無(wú)狀態(tài)的bean則應(yīng)該使用?singleton作用域?
request?
在一次HTTP請(qǐng)求中倍啥,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例禾乘;即每次HTTP請(qǐng)求將會(huì)有各自的bean實(shí)例,?它們依據(jù)某個(gè)bean定義創(chuàng)建而成虽缕。該作用?域僅在基于web的Spring?ApplicationContext情形下有效始藕。?
session?
在一個(gè)HTTP?Session中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例氮趋。該作用域僅在基于web的Spring?
ApplicationContext情形下有效伍派。?
global?session?
在一個(gè)全局的HTTP?Session中,一個(gè)bean定義對(duì)應(yīng)一個(gè)實(shí)例剩胁。典型情況下拙已,僅在使用portlet?
context的時(shí)候有效。該作用域僅在基于?web的Spring?ApplicationContext情形下有效摧冀。?
Bean的初始化方式有哪些
有兩種方式初始化Bean。
1、在配置文檔中通過(guò)指定init-method?屬性來(lái)完成
在Bean的類中實(shí)現(xiàn)一個(gè)初始化Bean屬性的方法索昂,如init()建车,如:
public?class?HelloWorld{
public?String?msg=null;
public?Date?date=null;
public?void?init()?{
msg=”HelloWorld”;
date=new?Date();
}
……
}
然后,在配置文件中設(shè)置init-mothod屬性:
2椒惨、實(shí)現(xiàn)?org.springframwork.beans.factory.InitializingBean接口
Bean實(shí)現(xiàn)InitializingBean接口缤至,并且增加?afterPropertiesSet()?方法:
public?class?HelloWorld?implement?InitializingBean?{
public?String?msg=null;
public?Date?date=null;
public?void?afterPropertiesSet()?{
msg=”向全世界問(wèn)好!”;
date=new?Date();
}
……
}
那么康谆,當(dāng)這個(gè)Bean的所有屬性被Spring的BeanFactory設(shè)置完后领斥,會(huì)自動(dòng)調(diào)用afterPropertiesSet()方法對(duì)?Bean進(jìn)行初始化,于是沃暗,配置文件就不用指定?init-method屬性了月洛。
Bean的調(diào)用方式有哪些
有三種方式可以得到Bean并進(jìn)行調(diào)用:
1、使用BeanWrapper
HelloWorld?hw=new?HelloWorld();
BeanWrapper?bw=new?BeanWrapperImpl(hw);
bw.setPropertyvalue(”msg”,”HelloWorld”);
system.out.println(bw.getPropertyCalue(”msg”));
2孽锥、使用BeanFactory
InputStream?is=new?FileInputStream(”config.xml”);
XmlBeanFactory?factory=new?XmlBeanFactory(is);
HelloWorld?hw=(HelloWorld)?factory.getBean(”HelloWorld”);
system.out.println(hw.getMsg());
3嚼黔、使用ApplicationConttext
ApplicationContext?actx=new?FleSystemXmlApplicationContext(”config.xml”);
HelloWorld?hw=(HelloWorld)?actx.getBean(”HelloWorld”);
System.out.println(hw.getMsg());
Bean的銷毀方式有哪些
1、使用配置文件中的?destory-method?屬性
與初始化屬性?init-methods類似惜辑,在Bean的類中實(shí)現(xiàn)一個(gè)撤銷Bean的方法唬涧,然后在配置文件中通過(guò)?destory-method指定,那么當(dāng)bean銷毀時(shí)盛撑,Spring將自動(dòng)調(diào)用指定的銷毀方法碎节。
2、實(shí)現(xiàn)?org.springframwork.bean.factory.DisposebleBean接口
如果實(shí)現(xiàn)了DisposebleBean接口抵卫,那么Spring將自動(dòng)調(diào)用bean中的Destory方法進(jìn)行銷毀狮荔,所以,Bean中必須提供?Destory方法陌僵。
介紹一下Spring的事務(wù)管理
事務(wù)就是對(duì)一系列的數(shù)據(jù)庫(kù)操作(比如插入多條數(shù)據(jù))進(jìn)行統(tǒng)一的提交或回滾操作轴合,如果插入成功,那么一起成功碗短,如果中間有一條出現(xiàn)異常受葛,那么回滾之?前的所有操作。?
這樣可以防止出現(xiàn)臟數(shù)據(jù)偎谁,防止數(shù)據(jù)庫(kù)數(shù)據(jù)出現(xiàn)問(wèn)題总滩。?
開發(fā)中為了避免這種情況一般都會(huì)進(jìn)行事務(wù)管理。Spring中也有自己的事務(wù)管理機(jī)制巡雨,一般是使用TransactionMananger進(jìn)行管?理闰渔,可以通過(guò)Spring的注入來(lái)完成此功能。?
spring提供了幾個(gè)關(guān)于事務(wù)處理的類:?
TransactionDefinition?//事務(wù)屬性定義?
TranscationStatus?//代表了當(dāng)前的事務(wù)铐望,可以提交冈涧,回滾茂附。?
PlatformTransactionManager這個(gè)是spring提供的用于管理事務(wù)的基礎(chǔ)接口,其下有一個(gè)實(shí)現(xiàn)的抽象類?AbstractPlatformTransactionManager,我們使用的事務(wù)管理類例如?DataSourceTransactionManager等都是這個(gè)類的子類督弓。?
一般事務(wù)定義步驟:?
TransactionDefinition?td?=?new?TransactionDefinition();?
TransactionStatus?ts?=?transactionManager.getTransaction(td);?
try?
{?//do?sth?
transactionManager.commit(ts);?
}?
catch(Exception?e){transactionManager.rollback(ts);}?
spring提供的事務(wù)管理可以分為兩類:編程式的和聲明式的营曼。編程式的,比較靈活愚隧,但是代碼量大蒂阱,存在重復(fù)的代碼比較多;聲明式的比編程式的更?靈活狂塘。?
編程式主要使用transactionTemplate录煤。省略了部分的提交,回滾荞胡,一系列的事務(wù)對(duì)象定義妈踊,需注入事務(wù)管理對(duì)象.?
void?add(){?
transactionTemplate.execute(?new?TransactionCallback(){?
pulic?Object?doInTransaction(TransactionStatus?ts)?
{?//do?sth}?
}?
}?
聲明式:?
使用TransactionProxyFactoryBean:?
PROPAGATION_REQUIRED?PROPAGATION_REQUIRED?PROPAGATION_REQUIRED,readOnly?
圍繞Poxy的動(dòng)態(tài)代理?能夠自動(dòng)的提交和回滾事務(wù)?
org.springframework.transaction.interceptor.TransactionProxyFactoryBean?
PROPAGATION_REQUIRED–支持當(dāng)前事務(wù),如果當(dāng)前沒(méi)有事務(wù)硝训,就新建一個(gè)事務(wù)响委。這是最常見(jiàn)的選擇。?
PROPAGATION_SUPPORTS–支持當(dāng)前事務(wù)窖梁,如果當(dāng)前沒(méi)有事務(wù)赘风,就以非事務(wù)方式執(zhí)行。?
PROPAGATION_MANDATORY–支持當(dāng)前事務(wù)纵刘,如果當(dāng)前沒(méi)有事務(wù)邀窃,就拋出異常。?
PROPAGATION_REQUIRES_NEW–新建事務(wù)假哎,如果當(dāng)前存在事務(wù)瞬捕,把當(dāng)前事務(wù)掛起。?
PROPAGATION_NOT_SUPPORTED–以非事務(wù)方式執(zhí)行操作舵抹,如果當(dāng)前存在事務(wù)肪虎,就把當(dāng)前事務(wù)掛起。?
PROPAGATION_NEVER–以非事務(wù)方式執(zhí)行惧蛹,如果當(dāng)前存在事務(wù)扇救,則拋出異常。?
PROPAGATION_NESTED–如果當(dāng)前存在事務(wù)香嗓,則在嵌套事務(wù)內(nèi)執(zhí)行迅腔。如果當(dāng)前沒(méi)有事務(wù),則進(jìn)行與?PROPAGATION_REQUIRED類似的操作靠娱。?
在此我向大家推薦一個(gè)架構(gòu)學(xué)習(xí)交流群沧烈。交流學(xué)習(xí)群號(hào):521353348 ?里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis像云,Netty源碼分析锌雀,高并發(fā)蚂夕、高性能、分布式腋逆、微服務(wù)架構(gòu)的原理双抽,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備的知識(shí)體系闲礼。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源,目前受益良多
為什么要有事務(wù)傳播行為
Spring里面如何配置數(shù)據(jù)庫(kù)驅(qū)動(dòng)
使用”org.springframework.jdbc.datasource.DriverManagerDataSource”數(shù)據(jù)源來(lái)配置數(shù)據(jù)庫(kù)驅(qū)動(dòng)铐维。示例如下:?
Spring里面applicationContext.xml文件能不能改成其他文件名
ContextLoaderListener是一個(gè)ServletContextListener,?它在你的web應(yīng)用啟動(dòng)的時(shí)候初始化柬泽。缺省情況下,?它會(huì)在WEB-INF/applicationContext.xml文件找Spring的配置嫁蛇。?你可以通過(guò)定義一個(gè)元素名字為”contextConfigLocation”來(lái)改變Spring配置文件的?位置锨并。示例如下:?
如何在web應(yīng)用里面配置spring
在web.xml中加入如下同容,在啟動(dòng)web服務(wù)器時(shí)加載/WEB-INF/applicationContext.xml中的內(nèi)容。?
通過(guò)如下類得到ApplicationContext實(shí)例?
????WebApplicationContextUtils.getWebApplicationContext?
Spring里面如何定義hibernate?mapping
添加hibernate?mapping?文件到web/WEB-INF目錄下的applicationContext.xml文件里面睬棚。示例如下:?
spring中的BeanFactory與ApplicationContext的作用有哪些
1.?BeanFactory負(fù)責(zé)讀取bean配置文檔第煮,管理bean的加載,實(shí)例化抑党,維護(hù)bean之間的依賴關(guān)系包警,負(fù)責(zé)bean的聲明周期。?
2.?ApplicationContext除了提供上述BeanFactory所能提供的功能之外底靠,還提供了更完整的框架功能:?
a.?國(guó)際化支持?
b.?資源訪問(wèn):Resource?rs?=?ctx.?getResource(”classpath:config.properties”),? “file:c:/config.properties”?
c.?事件傳遞:通過(guò)實(shí)現(xiàn)ApplicationContextAware接口?
3.?常用的獲取ApplicationContext的方法:?
FileSystemXmlApplicationContext:從文件系統(tǒng)或者url指定的xml配置文件創(chuàng)建害晦,參數(shù)為配置文件名或文件名數(shù)?組?
ClassPathXmlApplicationContext:從classpath的xml配置文件創(chuàng)建,可以從jar包中讀取配置文件?
WebApplicationContextUtils:從web應(yīng)用的根目錄讀取配置文件暑中,需要先在web.xml中配置壹瘟,可以配置監(jiān)聽器或者?servlet來(lái)實(shí)現(xiàn)?
這兩種方式都默認(rèn)配置文件為web-inf/applicationContext.xml,也可使用context-param指定配置文件?
BeanFactory?接口?和?ApplicationContext?接口區(qū)別?
*?ApplicationContext?接口繼承?BeanFactory?接口?鳄逾,Spring核心工廠是BeanFactory?,BeanFactory?采取延遲加載稻轨,第一次getBean時(shí)才會(huì)初始化Bean?,?ApplicationContext?是會(huì)在加載配置文件時(shí)初始化Bean?
*?ApplicationContext是對(duì)BeanFactory擴(kuò)展
國(guó)際化處理
事件傳遞
Bean自動(dòng)裝配
各種不同應(yīng)用層的Context實(shí)現(xiàn)
開發(fā)中基本都在使用ApplicationContext,?web項(xiàng)目使用WebApplicationContext?,很少用到BeanFactory?
BeanFactory?beanFactory?=?new?XmlBeanFactory(new?ClassPathResource("applicationContext.xml"));
IHelloService?helloService?=?(IHelloService)?beanFactory.getBean("helloService");
helloService.sayHello();
如何在web環(huán)境中配置applicationContext.xml文件
如何在spring中實(shí)現(xiàn)國(guó)際化
在applicationContext.xml加載一個(gè)bean?
??在src目錄下建多個(gè)properties文件?
??對(duì)于非英文的要用native2ascii?-encoding?gb2312?源?目轉(zhuǎn)化文件相關(guān)內(nèi)容?
??其命名格式是message_語(yǔ)言_國(guó)家雕凹。?
??頁(yè)面中的中顯示提示信息殴俱,鍵名取鍵值。?
??當(dāng)給定國(guó)家请琳,系統(tǒng)會(huì)自動(dòng)加載對(duì)應(yīng)的國(guó)家的properties信息粱挡。?
??通過(guò)applictionContext.getMessage(“鍵名”,”參數(shù)”,”區(qū)域”)取出相關(guān)的信息。?
Spring如何處理線程并發(fā)問(wèn)題
Spring使用ThreadLocal解決線程安全問(wèn)題
我們知道在一般情況下俄精,只有無(wú)狀態(tài)的Bean才可以在多線程環(huán)境下共享询筏,在Spring中,絕大部分Bean都可以聲明為singleton作用域竖慧。就是因?yàn)镾pring對(duì)一些Bean(如RequestContextHolder嫌套、TransactionSynchronizationManager逆屡、LocaleContextHolder等)中非線程安全狀態(tài)采用ThreadLocal進(jìn)行處理,讓它們也成為線程安全的狀態(tài)踱讨,因?yàn)橛袪顟B(tài)的Bean就可以在多線程中共享了魏蔗。
ThreadLocal和線程同步機(jī)制都是為了解決多線程中相同變量的訪問(wèn)沖突問(wèn)題。
在同步機(jī)制中痹筛,通過(guò)對(duì)象的鎖機(jī)制保證同一時(shí)間只有一個(gè)線程訪問(wèn)變量莺治。這時(shí)該變量是多個(gè)線程共享的,使用同步機(jī)制要求程序慎密地分析什么時(shí)候?qū)ψ兞窟M(jìn)行讀寫帚稠,什么時(shí)候需要鎖定某個(gè)對(duì)象谣旁,什么時(shí)候釋放對(duì)象鎖等繁雜的問(wèn)題,程序設(shè)計(jì)和編寫難度相對(duì)較大滋早。
而ThreadLocal則從另一個(gè)角度來(lái)解決多線程的并發(fā)訪問(wèn)榄审。ThreadLocal會(huì)為每一個(gè)線程提供一個(gè)獨(dú)立的變量副本,從而隔離了多個(gè)線程對(duì)數(shù)據(jù)的訪問(wèn)沖突杆麸。因?yàn)槊恳粋€(gè)線程都擁有自己的變量副本搁进,從而也就沒(méi)有必要對(duì)該變量進(jìn)行同步了。ThreadLocal提供了線程安全的共享對(duì)象昔头,在編寫多線程代碼時(shí)饼问,可以把不安全的變量封裝進(jìn)ThreadLocal。
由于ThreadLocal中可以持有任何類型的對(duì)象减细,低版本JDK所提供的get()返回的是Object對(duì)象匆瓜,需要強(qiáng)制類型轉(zhuǎn)換。但JDK5.0通過(guò)泛型很好的解決了這個(gè)問(wèn)題未蝌,在一定程度地簡(jiǎn)化ThreadLocal的使用驮吱。
概括起來(lái)說(shuō),對(duì)于多線程資源共享的問(wèn)題萧吠,同步機(jī)制采用了“以時(shí)間換空間”的方式左冬,而ThreadLocal采用了“以空間換時(shí)間”的方式。前者僅提供一份變量纸型,讓不同的線程排隊(duì)訪問(wèn)拇砰,而后者為每一個(gè)線程都提供了一份變量,因此可以同時(shí)訪問(wèn)而互不影響狰腌。
在此我向大家推薦一個(gè)架構(gòu)學(xué)習(xí)交流群除破。交流學(xué)習(xí)群號(hào):521353348 里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis琼腔,Netty源碼分析瑰枫,高并發(fā)、高性能、分布式光坝、微服務(wù)架構(gòu)的原理尸诽,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備的知識(shí)體系盯另。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源性含,目前受益良多
簡(jiǎn)單敘述一下Spring?中BeanFactory與ApplicationContext的差別
使用?BeanFactory?從?xml配置文件加載bean:??
簡(jiǎn)而言之,BeanFactory?提供了配置框架和基本的功能鸳惯,?而ApplicationContext?為它增加了更強(qiáng)的功能商蕴,這些功能中的一些或許更加接近J2EE?并且圍繞企業(yè)級(jí)應(yīng)用。一般來(lái)說(shuō)芝发,ApplicationContext是?BeanFactory?的完全超集究恤,?任何?BeanFactory?功能和行為的描述也同樣被認(rèn)為適用于ApplicationContext?
相對(duì)于?BeanFactory?而言,ApplicationContext?提供了以下擴(kuò)展功能.?
(a)?國(guó)際化支持??
(b)?資源訪問(wèn)?
(c)?事件傳播??
(d)?多實(shí)例加載?