深入理解微服務(wù)架構(gòu)spring的各個(gè)知識(shí)點(diǎn)(面試必問(wèn)知識(shí)點(diǎn))

前言:

最近整理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í)例加載?

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市后德,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌抄腔,老刑警劉巖瓢湃,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異赫蛇,居然都是意外死亡绵患,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門悟耘,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)落蝙,“玉大人,你說(shuō)我怎么就攤上這事暂幼》だ眨” “怎么了?”我有些...
    開封第一講書人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵旺嬉,是天一觀的道長(zhǎng)管行。 經(jīng)常有香客問(wèn)我,道長(zhǎng)邪媳,這世上最難降的妖魔是什么捐顷? 我笑而不...
    開封第一講書人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮雨效,結(jié)果婚禮上迅涮,老公的妹妹穿的比我還像新娘。我一直安慰自己徽龟,他們只是感情好叮姑,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著顿肺,像睡著了一般戏溺。 火紅的嫁衣襯著肌膚如雪渣蜗。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,970評(píng)論 1 284
  • 那天旷祸,我揣著相機(jī)與錄音耕拷,去河邊找鬼。 笑死托享,一個(gè)胖子當(dāng)著我的面吹牛骚烧,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播闰围,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼赃绊,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了羡榴?” 一聲冷哼從身側(cè)響起碧查,我...
    開封第一講書人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎校仑,沒(méi)想到半個(gè)月后忠售,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡迄沫,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年稻扬,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片羊瘩。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡泰佳,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出尘吗,到底是詐尸還是另有隱情逝她,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布睬捶,位于F島的核電站汽绢,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏侧戴。R本人自食惡果不足惜宁昭,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望酗宋。 院中可真熱鬧积仗,春花似錦、人聲如沸蜕猫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間凉倚,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工旨涝, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人侣背。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓白华,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親贩耐。 傳聞我的和親對(duì)象是個(gè)殘疾皇子弧腥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn)潮太,斷路器管搪,智...
    卡卡羅2017閱讀 134,599評(píng)論 18 139
  • IOC和DI是什么? Spring IOC 的理解铡买,其初始化過(guò)程抛蚤? BeanFactory 和 FactoryBe...
    justlpf閱讀 3,455評(píng)論 1 21
  • 什么是Spring Spring是一個(gè)開源的Java EE開發(fā)框架。Spring框架的核心功能可以應(yīng)用在任何Jav...
    jemmm閱讀 16,441評(píng)論 1 133
  • 第一次畫動(dòng)物寻狂,被原圖萌的不行。就臨摹了朋沮。眼睛的手動(dòng)留白沒(méi)畫好蛇券,后邊用了留白液,效果不太好樊拓。以后會(huì)多嘗試這種萌系畫風(fēng)
    如琳閱讀 153評(píng)論 0 0
  • 2017年8月19日 周六 晴 欣賞自己:每個(gè)人的生活都不會(huì)一帆風(fēng)順纠亚,我們要做的就是堅(jiān)強(qiáng),努力讓自己快速變強(qiáng)筋夏,才能...
    紅琳923閱讀 185評(píng)論 0 0