版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領
文檔簡介
1、2020-6-17蝌蚪成長記Spring常見面試題總結(jié)1、Spring 是什么?2、Spring 的優(yōu)點?3、談談你對 Spring 的AOP理解4、談談你對 Spring 的IoC理解:目錄5、BeanFactory 和 ApplicationContext有什么區(qū)別?6、請解釋Spring Bean的生命周期?7、解釋Spring 支持的幾種bean的作用域8、Spring 框架中的單例 Beans是線程安全的么?9、Spring如何處理線程并發(fā)問題?10、Spring 基于xml注入bean的幾種方式11、Spring 的自動裝配:12、Spring事務的實現(xiàn)方式和實現(xiàn)原理
2、7.1010101213、Spring的事務傳播行為理解1214、Spring中的隔離級別1315、Spring框架中有哪些不同類型的事件?1416、解釋一下 Spring AOP 里面的幾個名詞17、Spring 通知有哪些類型?18、什么是Spring 的依賴注入?19、在Spring 中如何注入一個 java集合?20、Spring 支持的 ORM21、Spring如何處理線程并發(fā)問題?14151717171822、Spring框架中都用到了哪些設計模式? 1923、 什么是 spring 的內(nèi)部 bean ? 1924、描述一下 DispatcherServlet 的工作流程 2025
3、、Component 和 Bean 的區(qū)別是什么? 211、Spring 是什么Spring是一個輕量級的IoC和AOP容器框架。是為Java應用程序提供基礎性服務的一套框架,目的是用于簡化企業(yè)應用程序的開發(fā),它使得開發(fā)者只需要關(guān)心業(yè)務需求。常見的配置方式有三種:基于 XML的配置、基于注解的配置、基于 Java的配置。主要由以下幾個模塊組成:Spring Core :核心類庫,提供IOC服務;Spring Context :提供框架式的 Bean訪問方式,以及企業(yè)級功能( JNDI、定時任務等);Spring AOP : AOP 服務;Spring DAOSpring ORMSpring W
4、ebSpring MVC:對JDBC的抽象,簡化了數(shù)據(jù)訪問異常的處理;:對現(xiàn)有的 ORM框架的支持;:提供了基本的面向 Web的綜合特性,例如多方文件上傳;:提供面向 Web應用的Model-View-Controller 實現(xiàn)。2、(1(2(3Spring的優(yōu)點?spring屬于低侵入式設計,代碼的污染極低;spring的DI機制將對象之間的依賴關(guān)系交由框架處理,減低組件的耦合性;Spring提供了 AOP技術(shù),支持將一些通用任務,如安全、事務、日志、權(quán)限等進行集中式管理,從而提供更好的復用。(4) spring對于主流的應用框架提供了集成支持。3、談談你對Spring 的AOP理解OOP面
5、向?qū)ο?,允許開發(fā)者定義縱向的關(guān)系,但并適用于定義橫向的關(guān)系,導致了大量代碼的重復,而不利于各個模塊的重用。AOP , 一般稱為面向切面,作為面向?qū)ο蟮囊环N補充,用于將那些與業(yè)務無關(guān),但卻對多個對象產(chǎn)生影響的公共行為和邏輯,抽取并封裝為一個可重用的模塊,這個模塊被命名為“切 面" (Aspect ),減少系統(tǒng)中的重復代碼,降低了模塊間的耦合度,同時提高了系統(tǒng)的可維護性。可用于權(quán)限認證、日志、事務處理。AOP實現(xiàn)的關(guān)鍵在于 代理模式,AOP代理主要分為靜態(tài)代理和動態(tài)代理。靜態(tài)代理的代表為AspectJ ;動態(tài)代理則以 Spring AOP 為代表。(1)AspectJ是靜態(tài)代理的增強,所
6、謂靜態(tài)代理,就是AOP框架會在編譯階段生成 AOP代理類,因此也稱為編譯時增強,他會在編譯階段將 AspectJ(切面)織入到Java字節(jié)碼中,運行的時候就是增強之后的AOP對象。(2) Spring AOP 使用的動態(tài)代理,所謂的動態(tài)代理就是說AOP框架不會去修改字節(jié)碼,而是每次運行時在內(nèi)存中臨時為方法生成一個AOP對象,這個 AOP對象包含了目標對象的全部方法,并且在特定的切點做了增強處理,并回調(diào)原對象的方法。Spring AOP 中的動態(tài)代理主要有兩種方式,JDK動態(tài)代理和 CGLIB動態(tài)代理:JDK動態(tài)代理只提供接口的代理,不支持類的代理。核心 InvocationHandler 接口
7、和Proxy類,InvocationHandler通過invoke()方法反射來調(diào)用目標類中的代碼,動態(tài)地將橫切邏輯和業(yè)務編織在一起;接著, Proxy利用InvocationHandler動態(tài)創(chuàng)建一個符合某一接口的的實例,生成目標類的代理對象。如果代理類沒有實現(xiàn)InvocationHandler 接口,那么Spring AOP會選擇使用CGLIB來動態(tài)代理目標類。CGLIB (Code Generation Library ),是一個代碼生成的類庫,可以在運行時動態(tài)的生成指定類的一個子類對象,并覆蓋其中特定方法并添加增強代碼,從而實現(xiàn)AOP。CGLIB是通過繼承的方式做的動態(tài)代理,因此如果某
8、個類被標記為final ,那么它是無法使用CGLIB做動態(tài)代理的。(3)靜態(tài)代理與動態(tài)代理區(qū)別在于生成AOP代理對象的時機不同,相對來說AspectJ的靜態(tài)代理方式具有更好的性能,但是AspectJ需要特定的編譯器進行處理,而Spring AOP則無需特定的編譯器處理。InvocationHandler 的 invoke(Object proxy,Methodmethod,Object口 args)proxy是最終生成的代理實例;method 是被代理目標實例的某個具體方法;args是被代理目標實例某個方法的具體入?yún)?,在方法反射調(diào)用時使用。4、談談你對 Spring 的IoC理解:(1) IO
9、C就是控制反轉(zhuǎn),是指創(chuàng)建對象的控制權(quán)的轉(zhuǎn)移,以前創(chuàng)建對象的主動權(quán)和時機是由自己把控的,而現(xiàn)在這種權(quán)力轉(zhuǎn)移到Spring容器中,并由容器根據(jù)配置文件去創(chuàng)建實例和管理各個實例之間的依賴關(guān)系,對象與對象之間松散耦合,也利于功能的復用。DI依賴注入,和控制反轉(zhuǎn)是同一個概念的不同角度的描述,即應用程序在運行時依賴IoC容器來動態(tài)注入對象需要的外部資源。(2)最直觀的表達就是,IOC讓對象的創(chuàng)建不用去 new 了,可以由spring自動生產(chǎn),使 用java的反射機制,根據(jù)配置文件在運行時動態(tài)的去創(chuàng)建對象以及管理對象,并調(diào)用對象 的方法的。setter方法注入、根據(jù)注解注入。(3) Spring的IOC有三
10、種注入方式 :構(gòu)造器注入、IoC讓相互協(xié)作的組件保持松散的耦合,而AOP編程允許你把遍布于應用各層的功能分離出來形成可重用的功能組件。5、BeanFactory 和 Applicationcontext 有什么區(qū)別?BeanFactory 和 Applicationcontext 是 Spring 的兩大核心接口,都可以當做Spring 的 容器。其中 Applicationcontext 是 BeanFactory 的子接口。(1) BeanFactory :是Spring 里面最底層的接口,包含了各種Bean的定義,讀取 bean配置文檔,管理 bean的加載、實例化,控制 bean的生命
11、周期,維護 bean之間的依賴關(guān)系。ApplicationContext 接口作為 BeanFactory 的派生,除了提供 BeanFactory 所具有的功能外,還提供了更完整的框架功能:繼承MessageSource ,因此支持國際化。統(tǒng)一的資源文件訪問方式。提供在監(jiān)聽器中注冊bean的事件。同時加載多個配置文件。載入多個(有繼承關(guān)系)上下文 ,使得每一個上下文都專注于一個特定的層次,比如應用的web層。(2)BeanFactroy采用的是延遲加載形式來注入Bean的,即只有在使用到某個Bean時(調(diào)用getBean(),才對該 Bean進行加載實例化。這樣,我們就不能發(fā)現(xiàn)一些存在的Sp
12、ring的配置問題。如果 Bean的某一個屬性沒有注入,BeanFacotry 加載后,直至第 次使用調(diào)用getBean方法才會拋出異常。ApplicationContext,它是在容器啟動時,一次性創(chuàng)建了所有白Bean。這樣,在容器啟動時,我們就可以發(fā)現(xiàn) Spring中存在的配置錯誤,這樣有利于檢查所依賴屬性是否注入。ApplicationContext啟動后預載入所有的單實例Bean ,通過預載入單實例 bean,確保當你需要的時候,你就不用等待,因為它們已經(jīng)創(chuàng)建好了。相對于基本的 BeanFactory , ApplicationContext唯一的不足是占用內(nèi)存空間。當應用 程序配置B
13、ean較多時,程序啟動較慢。(3) BeanFactory通常以編程的方式被創(chuàng)建,ApplicationContext還能以聲明的方式創(chuàng) 建,如使用 ContextLoader 。者B 支持 BeanPostProcessor4 ) BeanFactory 和 ApplicationContextBeanFactoryPostProcessor的使用,但兩者之間的區(qū)別是:BeanFactory 需要手動注nn-pplicationContext則是自動注冊。6、請解釋 Spring Bean的生命周期?首先說一下Servlet的生命周期:實例化,初始init ,接收請求 service ,銷毀
14、 destroSprng上下文中的Bean生命周期也類似,如下:實例化Bean :對于BeanFactory 容器,當客戶向容器請求一個尚未初始化的bean 時,或初始化 bean 的時候需要注入另一個尚未初始化的依賴時,容器就會調(diào)用createBean 進行實例化。對于ApplcationContext 容器,當容器啟動結(jié)束后,通過獲取BeanDefinition對象中的信息,實例化所有的 bean 。(2)設置對象屬性(依賴注入)Spring 根據(jù) BeanDefinition 中實例化后的對象被封裝在BeanWrapper 對象中,緊接著, 的信息以及通過BeanWrapper 提供的設
15、置屬性的接口完成依賴注入。(3)處理 Aware 接 口 :接著,Spring會檢測該對象是否實現(xiàn)了xxxAware接口,并將相關(guān)的 xxxAware實例注入給 Bean :如果這個 Bean 已經(jīng)實現(xiàn)了 BeanNameAware 接口,會調(diào)用它實現(xiàn)的setBeanName(String beanld)方法,此處傳遞的就是Spring 配置文件中 Bean的id值;如果這個Bean已經(jīng)實現(xiàn)了 BeanFactoryAware接口,會調(diào)用它實現(xiàn)的 setBeanFactory()方法,傳遞的是 Spring工廠自身。如果這個 Bean 已經(jīng)實現(xiàn)了 ApplicationContextAware
16、 接口,會調(diào)用setApplicationContext(ApplicationContext)方法,傳入 Spring 上下文;(4) BeanPostProcessor :如果想對Bean進行一些自定義的處理,那么可以讓 Bean實現(xiàn)了 BeanPostProcessor 接口,那將會調(diào)用 postProcessBeforeInitialization(Object obj, String s)方法。(5) InitializingBean 與 init-method :如果Bean在Spring配置文件中配置了init-method 屬性,則會自動調(diào)用其配置的初始化方法。(6 ) 如果這
17、個 Bean 實現(xiàn)了 BeanPostProcessor 接口, 將會調(diào)用 postProcessAfterInitialization(Object obj, String s)方法;由于這個方法是在 Bean 初始化結(jié)束時調(diào)用的,所以可以被應用于內(nèi)存或緩存技術(shù);以上幾個步驟完成后,Bean就已經(jīng)被正確創(chuàng)建了,之后就可以使用這個Bean 了。(7) DisposableBean當Bean不再需要時,會經(jīng)過清理階段,如果 Bean實現(xiàn)了 DisposableBean這個接口,會 調(diào)用其實現(xiàn)的destroy()方法;(8) destroy-method :最后,如果這個 Bean的Spring配
18、置中配置了 destroy-method 屬性,會自動調(diào)用其配置的銷毀方法。7、解釋 Spring支持的幾種bean的作用域Spring容器中的bean可以分為5個范圍:(1 ) singleton :默認,每個容器中只有一個bean的實例,單例的模式由BeanFactory自身來維護。(2) prototype :為每一個 bean請求提供一個實例。(3) request :為每一個網(wǎng)絡請求創(chuàng)建一個實例,在請求完成以后,bean會失效并被垃圾回收器回收。session :與request 范圍類似,確保每個 session 中有一個bean的實例,在session過期后,bean會隨之失效。
19、 global-session :全局作用域,global-session和Portlet應用相關(guān)。當你的應用部署在Portlet容器中工作時,它包含很多portlet 。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那么這全局變量需要存儲在global-session 中。全局作用域與Servlet 中的session作用域效果相同。8、Spring 框架中的單例 Beans是線程安全的么?Spring框架并沒有對單例 bean進行任何多線程的封裝處理。關(guān)于單例 bean的線程安全和并發(fā)問題需要開發(fā)者自行去搞定。但實際上,大部分的Spring bean并沒有可變的狀態(tài)(比如Se
20、rview 類和DAO類),所以在某種程度上說Spring的單例bean是線程安全的。如果你的bean有多種狀態(tài)的話 (比如 View Model 對象),就需要自行保證線程安全。最淺顯的解決辦法就是將多態(tài)bean的作用域由“ singleton "變更為" prototype9、Spring如何處理線程并發(fā)問題?在一般情況下,只有無狀態(tài)的Bean才可以在多線程環(huán)境下共享,在 Spring中,絕大部分Bean都可以聲明為 singleton 作用域,因為 Spring對一些Bean中非線程安全狀態(tài)采用ThreadLocal進行處理,解決線程安全問題。ThreadLocal和
21、線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。同步機制采用了 “時間換空間”的方式,僅提供一份變量,不同的線程在訪問前需要獲取鎖,沒獲得鎖的線程則需要排隊。而 ThreadLocal采用了 “空間換時間”的方式。ThreadLocal會為每一個線程提供一個獨立的變量副本,從而隔離了多個線程對數(shù)據(jù)的訪問沖突。因為每一個線程都擁有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝 進 ThreadLocal 。10、Spring 基于xml注入bean的幾種方式(1 ) Set方法注入;(2)構(gòu)造
22、器注入:通過 index設置參數(shù)的位置;通過 type設置參數(shù)類型;(3)靜態(tài)工廠注入;(4)實例工廠;11、Spring的自動裝配:在spring中,對象無需自己查找或創(chuàng)建與其關(guān)聯(lián)的其他對象,由容器負責把需要相互協(xié)作的對象引用賦予各個對象,使用autowire 來配置自動裝載模式。在Spring框架xml配置中共有5種自動裝配:(1)no :默認的方式是不進行自動裝配的,通過手工設置ref屬性來進行裝配 bean 。byName :通過 bean 的名稱進行自動裝配,如果一個bean 的property 與另bean的name相同,就進行自動裝配。byType :通過參數(shù)的數(shù)據(jù)類型進行自動裝
23、配。constructor :利用構(gòu)造函數(shù)進行裝配,并且構(gòu)造函數(shù)的參數(shù)通過byType進行裝配。(5) autodetect :自動探測,如果有構(gòu)造方法,通過 construct的方式自動裝配,否貝!用byType的方式自動裝配。基于注解的方式:使用Autowired注解來自動裝配指定的bean。在使用Autowired注解之前需要在Spring 配置文件進行配置,<context:annotation-config />。在啟動spring IoC 時器自動裝載了一個AutowiredAnnotationBeanPostProcessor后置處理器,當容器掃描到Autowied
24、、Resource 或Inject 時,就會在IoC容器自動查找需要的bean ,并裝配給該對象的屬性。在使用 Autowired 時,首先在容器中查詢對應類型的bean :如果查詢結(jié)果剛好為一個,就將該bean裝配給Autowired 指定的數(shù)據(jù);如果查詢的結(jié)果不止一個,那么Autowired會根據(jù)名稱來查找;如果上述查找的結(jié)果為空,那么會拋出異常。解決方法時,使用required=false 。Autowired可用于:構(gòu)造函數(shù)、成員變量、Setter方法注:Autowired 和Resource 之間的區(qū)別(1) Autowired默認是按照類型裝配注入的,默認情況下它要求依賴對象必須存
25、在(可以設置它required 屬性為false )。(2) Resource默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean 才會按照類型來裝配注入。12、Spring事務的實現(xiàn)方式和實現(xiàn)原理Spring事務的本質(zhì)其實就是數(shù)據(jù)庫對事務的支持,沒有數(shù)據(jù)庫的事務支持,spring是無法提供事務功能的。真正的數(shù)據(jù)庫層的事務提交和回滾是通過binlog或者redo log 實現(xiàn)的。(1) Spring事務的種類:spring支持編程式事務管理和聲明式事務管理兩種方式:編程式事務管理使用 TransactionTemplate 。聲明式事務管理建立在 AOP之上的。其本質(zhì)是通過 AOP功能
26、,對方法前后進行攔截,將事務處理的功能編織到攔截的方法中,也就是在目標方法開始之前加入一個事務,在執(zhí)行完目標方法之后根據(jù)執(zhí)行情況提交或者回滾事務。聲明式事務最大的優(yōu)點就是不需要在業(yè)務邏輯代碼中摻雜事務管理的代碼,只需在配置文件中做相關(guān)的事務規(guī)則聲明或通過Transactional注解的方式,便可以將事務規(guī)則應用到業(yè)務邏輯中。聲明式事務管理要優(yōu)于編程式事務管理,這正是spring倡導的非侵入式的開發(fā)方式,使業(yè)務代碼不受污染,只要加上注解就可以獲得完全的事務支持。唯一不足地方是,最細粒度只能作用到方法級別,無法做到像編程式事務那樣可以作用到代碼塊級別。13、Spring的事務傳播行為理解sprin
27、g事務的傳播行為說的是,當多個事務同時存在的時候,spring如何處理這些事務的行為。PROPAGATION_REQUIRED :如果當前沒有事務,就創(chuàng)建一個新事務,如果當前存在事務,就加入該事務,該設置是最常用的設置。PROPAGATION_SUPPORTS :支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就以非事務執(zhí)行。PROPAGATION_MANDATORY :支持當前事務,如果當前存在事務,就加入該事務,如果當前不存在事務,就拋出異常。PROPAGATION_REQUIRES_NEW :創(chuàng)建新事務,無論當前存不存在事務,都創(chuàng)建 新事務。PROPAGATION_NO
28、T_SUPPORTED 以非事務方式執(zhí)行操作, 如果當前存在事務, 就把當前事務掛起。PROPAGATION_NEVER :以非事務方式執(zhí)行,如果當前存在事務,則拋出異常。PROPAGATION_NESTED :如果當前存在事務,則在嵌套事務內(nèi)執(zhí)行。如果當前沒有事務,則按 REQUIRED屬性執(zhí)行。14、Spring中的隔離級別 ISOLATION_DEFAULT :這是乍latfromTransactionManager默認的隔離級別,使用數(shù)據(jù)庫默認的事務隔離級別。 ISOLATION_READ_UNCOMMITTED事務未提交的數(shù)據(jù)。:讀未提交,允許另外一個事務可以看到這個 ISOLATI
29、ON_READ_COMMITTED:讀已提交,保證一個事務修改的數(shù)據(jù)提交后才能被另一事務讀取,而且能看到該事務對已有記錄的更新。ISOLATION_REPEATABLE_READ 可重復讀,保證一個事務修改的數(shù)據(jù)提交后才能被另一事務讀取,但是不能看到該事務對已有記錄的更新。ISOLATION_SERIALIZABLE : 一個事務在執(zhí)行的過程中完全看不到其他事務對數(shù)據(jù) 庫所做的更新。15、Spring框架中有哪些不同類型的事件?Spring提供了以下5種標準的事件:1 ) 上下文更新事件(ContextRefreshedEvent )ConfigurableApplicationContext
30、 接口中的refresh()方法時被觸發(fā)。(2 )上下文開始事件(ContextStartedEvent當容器調(diào)Conf gurableApplicationContext的Start()方法開始/重新開始容器時觸發(fā)該事件。(3 )上下文停止事件(ContextStoppedEvent):當容器調(diào)ConfigurableApplicationContext的Stop()方法停止容器時觸發(fā)該事件。上下文關(guān)閉事件(ContextClosedEvent ):當ApplicationContext被關(guān)閉時觸發(fā)該事件。容器被關(guān)閉時,其管理的所有單例Bean都被銷毀。請求處理事件(RequestHandl
31、edEvent ):在 Web應用中,當個 http 請求(request )結(jié)束觸發(fā)該事件。如果個bean實現(xiàn)了ApplicationListener 接口,當一個 ApplicationEvent 被發(fā)布以后,bean會自動被通知。16、解釋一下Spring AOP 里面的幾個名詞(1)切面(Aspect ):被抽取的公共模塊,可能會橫切多個對象。Spring AOP 中面可以使用通用類(基于模式的風格)或者在普通類中以AspectJ注解來實現(xiàn)。(2)連接點(Join point ):指方法,在 Spring AOP 中,一個連接點總是代表一個方法的執(zhí)行。(3)通知(Advice ):在切
32、面的某個特定的連接點(Join point )上執(zhí)行的動作。通知有各種類型,其中包括" around ""before"和"after ”等通窿=AOP框架,包才S Spring ,都是以攔截器做通知模型,并維護一個以連接點為中心的攔截器鏈。(4)切入點(Pointcut ):切入點是指 我們要對哪些Join point進行攔截的定義。通過切入點表達式,指定攔截的方法,比如指定攔截add*、search*。(5)弓I入(Introduction ):(也被稱為內(nèi)部類型聲明(inter-type declaration )。聲明額外的方法或者某個
33、類型的字段。Spring允許引入新的接口(以及一個對應的實現(xiàn))到任何被代理的對象。例如,你可以使用一個引入來使bean實現(xiàn)IsModified 接口,以便簡化緩存機制。(6)目標對象(Target Object ): 被一個或者多個切面(aspect )所通知(advise )的對象。也有人把它叫做被通知(adviced )對象。既然Spring AOP是通過運行時代理實現(xiàn)的,這個對象永遠是一個被代理(proxied )對象。(7)織入(Weaving ):指把增強應用到目標對象來創(chuàng)建新的代理對象的過程。Spring是在運行時完成織入。切入點(pointcut )和連接點(join point
34、 )匹配的概念是 AOP的關(guān)鍵,這使得 AOP不同于其它僅僅提供攔截功能的舊技術(shù)。切入點使得定位通知(advice )可獨立于 OO層次。例如,一個提供聲明式事務管理的around通知可以被應用到一組橫跨多個對象中的方法上(例如服務層的所有業(yè)務操作)。17、Spring通知有哪些類型?(1)前置通知(Before advice ):在某連接點(join point )之前執(zhí)行的通知,但這個通知不能阻止連接點前的執(zhí)行(除非它拋出一個異常) 。(2)返回后通知(After returning advice ):在某連接點(join point )正常完成后執(zhí)行的 通知:例如,一個方法沒有拋出任何異
35、常,正常返回。(3)拋出異常后通知(After throwing advice ):在方法拋出異常退出時執(zhí)行的通知。(4)后通知(After (finally) advice ):當某連接點退出的時候執(zhí)行的通知(不論是正常返 回還是異常退出)。(5)環(huán)繞通知(Around Advice ):包圍一個連接點(join point )的通知,如方法調(diào)用。這是最強大的一種通知類型。環(huán)繞通知可以在方法調(diào)用前后完成自定義的行為。它也會選環(huán)繞通知是擇是否繼續(xù)執(zhí)行連接點或直接返回它們自己的返回值或拋出異常來結(jié)束執(zhí)行。最常用的一種通知類型。大部分基于攔截的AOP框架,例如Nanning 和JBoss4 ,都只
36、提供環(huán)繞通知。同一個aspect ,不同advice 的執(zhí)行順序:沒有異常情況下的執(zhí)行順序:around before advicebefore advicetarget method 執(zhí)行around after adviceafter adviceafterReturning有異常情況下的執(zhí)行順序:around before advicebefore advicetarget method 執(zhí)行around after adviceafter adviceafterThrowing:異常發(fā)生java.lang.RuntimeException:異常發(fā)生18、什么是Spring 的依賴注入?
37、依賴注入,是IOC的一個方面,是個通常的概念,它有多種解釋。這概念是說你不用創(chuàng)建對象,而只需要描述它如何被創(chuàng)建。你不在代碼里直接組裝你的組件和服務,但是要在配置文件里描述哪些組件需要哪些服務,之后一個容器( IOC容器)負責把他們組裝起來。19Spring在Spring中如何注入一個 java集合?提供以下幾種集合的配置元素:<list>類型用于注入一列值,允許有相同的值。<set>類型用于注入一組值,不允許有相同的值。<map> 類型用于注入一組鍵值對,鍵和值都可以為任意類型。<props>類型用于注入一組鍵值對,鍵和值都只能為String類型
38、。20SprinSpring支持以下支持的ORMORM :HibernateiBatisJPA (Java Persistence API)TopLink? JDO (Java Data Objects) ? OJB21、Spring如何處理線程并發(fā)問題?Spring使用ThreadLocal 解決線程安全問題我們知道在一般情況下,只有無狀態(tài)的 Bean才可以在多線程環(huán)境下共享,在 Spring中, 絕大部分Bean都可以聲明為singleton 作用域。就是因為 Spring對一些Bean(如 RequestContextHolder 、TransactionSynchronizationM
39、anager 、 LocaleContextHolder等)中非線程安全狀態(tài)采用ThreadLocal進行處理,讓它們也成為線程安全的狀態(tài),因為有狀態(tài)的Bean就可以在多線程中共享了。ThreadLocal和線程同步機制都是為了解決多線程中相同變量的訪問沖突問題。在同步機制中,通過對象的鎖機制保證同一時間只有一個線程訪問變量。這時該變量是多 個線程共享的,使用同步機制要求程序慎密地分析什么時候?qū)ψ兞窟M行讀寫,什么時候需 要鎖定某個對象,什么時候釋放對象鎖等繁雜的問題,程序設計和編寫難度相對較大。而ThreadLocal則從另一個角度來解決多線程的并發(fā)訪問。ThreadLocal會為每一個線程提
40、供一個獨立的變量副本,從而隔離了多個線程對數(shù)據(jù)的訪問沖突。因為每一個線程都擁 有自己的變量副本,從而也就沒有必要對該變量進行同步了。ThreadLocal提供了線程安全的共享對象,在編寫多線程代碼時,可以把不安全的變量封裝進ThreadLocal 。由于ThreadLocal中可以持有任何類型的對象,低版本JDK所提供的get()返回的是Object對象,需要強制類型轉(zhuǎn)換。但 JDK5.0通過泛型很好的解決了這個問題,在一定程 度地簡化ThreadLocal的使用。概括起來說,對于多線程資源共享的問題,同步機制采用了 “以時間換空間”的方式,而 ThreadLocal采用了 “以空間換時間”的
41、方式。前者僅提供一份變量,讓不同的線程排隊 訪問,而后者為每一個線程都提供了一份變量,因此可以同時訪問而互不影響。22、Spring框架中都用到了哪些設計模式?(1)工廠模式:BeanFactory 就是簡單工廠模式的體現(xiàn),用來創(chuàng)建對象的實例;(2)單例模式:Bean默認為單例模式。(3)代理模式:Spring的AOP功能用到了 JDK的動態(tài)代理和 CGLIB字節(jié)碼生成技術(shù);(4 )模板方法:用來解決代碼 重復的問題。比如.RestTemplate, JmsTemplate,JpaTemplate 。觀察者模式:定義對象鍵一種一對多的依賴關(guān)系,當一個對象的狀態(tài)發(fā)生改變時,所現(xiàn)-有依賴于它的對象都會得到通知被制動更新,如Spring 中l(wèi)istener 的實Appl cationListener23、什么是spring 的內(nèi)部bean ?只有將bean用作另一個 bean的屬性
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024物業(yè)維修與科技公司關(guān)于智能家居系統(tǒng)改造合同
- 2025年度特種貨物運輸保險服務協(xié)議2篇
- 2024年食品行業(yè)分銷協(xié)議
- 2024牛肉餐飲行業(yè)供應與服務合同
- 2024網(wǎng)絡云存儲服務提供商之間的數(shù)據(jù)共享與安全保密合同
- 2025年度互聯(lián)網(wǎng)+農(nóng)業(yè)合作經(jīng)營合同范本3篇
- 2024版職工勞動合同書模板
- 2025年水稻種植戶農(nóng)產(chǎn)品電商渠道拓展合同3篇
- 2024衣柜墻板吊頂裝修工程合同轉(zhuǎn)讓與權(quán)利義務繼承合同
- 二零二四年商業(yè)街區(qū)鋪面長期租賃合同樣本3篇
- 中央2025年國務院發(fā)展研究中心有關(guān)直屬事業(yè)單位招聘19人筆試歷年參考題庫附帶答案詳解
- 外呼合作協(xié)議
- 小學二年級100以內(nèi)進退位加減法800道題
- 2025年1月普通高等學校招生全國統(tǒng)一考試適應性測試(八省聯(lián)考)語文試題
- 《立式輥磨機用陶瓷金屬復合磨輥輥套及磨盤襯板》編制說明
- 保險公司2025年工作總結(jié)與2025年工作計劃
- 育肥牛購銷合同范例
- 暨南大學珠海校區(qū)財務辦招考財務工作人員管理單位遴選500模擬題附帶答案詳解
- DB51-T 2944-2022 四川省社會組織建設治理規(guī)范
- 2024北京初三(上)期末英語匯編:材料作文
- 2024年大型風力發(fā)電項目EPC總承包合同
評論
0/150
提交評論