Spring中常見面試題

什么是Spring

Spring是一個開源的Java EE開發框架。Spring框架的核心功能可以應用在任何Java應用程序中,但對Java EE平臺上的Web應用程序有更好的擴展性。Spring框架的目標是使得Java EE應用程序的開發更加簡捷,通過使用POJO為基礎的編程模型促進良好的編程風格。


Spring有哪些優點

輕量級:Spring在大小和透明性方面絕對屬于輕量級的,基礎版本的Spring框架大約只有2MB。

控制反轉(IOC):Spring使用控制反轉技術實現了松耦合。依賴被注入到對象,而不是創建或尋找依賴對象。

面向切面編程(AOP): Spring支持面向切面編程,同時把應用的業務邏輯與系統的服務分離開來

容器:Spring包含并管理應用程序對象的配置,依賴關系和生命周期。

MVC框架:Spring的web框架是一個設計優良的web MVC框架,很好的取代了一些web框架。

事務管理:Spring對下至本地業務上至全局業務(JAT)提供了統一的事務管理接口。

異常處理:Spring提供一個方便的API將特定技術的異常(由JDBC, Hibernate, 或JDO拋出)轉化為一致的、Unchecked異常。


Spring框架有哪些模塊

Spring框架至今已集成了20多個模塊。這些模塊主要被分如下圖所示的核心容器、數據訪問/集成、Web、AOP(面向切面編程)、工具、消息和測試模塊。

核心容器模塊:是spring中最核心的模塊。負責Bean的創建,配置和管理。主要包括:beans,core,context,expression等模塊。

Spring的AOP模塊:主要負責對面向切面編程的支持,幫助應用對象解耦。

數據訪問和集成模塊:包括JDBC,ORM,OXM,JMS和事務處理模塊,其細節如下: JDBC模塊提供了不再需要冗長的JDBC編碼相關了JDBC的抽象層。 ORM模塊提供的集成層。流行的對象關系映射API,包括JPA,JDO,Hibernate和iBatis。 OXM模塊提供了一個支持對象/ XML映射實現對JAXB,Castor,使用XMLBeans,JiBX和XStream 的抽象層。 Java消息服務JMS模塊包含的功能為生產和消費的信息。 事務模塊支持編程和聲明式事務管理實現特殊接口類,并為所有的POJO。

Web和遠程調用:包括web,servlet,struts,portlet模塊。

測試模塊:test

工具模塊消息模塊


什么是控制反轉(IOC)?什么是依賴注入?

傳統模式中對象的調用者需要創建被調用對象,兩個對象過于耦合,不利于變化和拓展.在spring中,直接操控的對象的調用權交給容器,通過容器來實現對象組件的裝配和管理,從而實現對象之間的松耦合。所謂的“控制反轉”概念就是對組件對象控制權的轉移,從程序代碼本身轉移到了外部容器。

依賴注入:對象無需自行創建或管理它們的依賴關系,IoC容器在運行期間,動態地將某種依賴關系注入到對象之中。依賴注入能讓相互協作的軟件組件保持松散耦合。


BeanFactory和ApplicationContext有什么區別?

Bean工廠(BeanFactory)是Spring框架最核心的接口,提供了高級Ioc的配置機制.

應用上下文(ApplicationContext)建立在BeanFacotry基礎之上,提供了更多面向應用的功能,如果國際化,屬性編輯器,事件等等.

beanFactory是spring框架的基礎設施,是面向spring本身,ApplicationContext是面向使用Spring框架的開發者,幾乎所有場合都會用到ApplicationContext.


Spring有幾種配置方式?

將Spring配置到應用開發中有以下三種方式:

基于XML的配置:基于注解的配置: Spring在2.5版本以后開始支持用注解的方式來配置依賴注入。可以用注解的方式來替代XML方式的bean描述,可以將bean描述轉移到組件類的內部,只需要在相關類上、方法上或者字段聲明上使用注解即可。注解注入將會被容器在XML注入之前被處理,所以后者會覆蓋掉前者對于同一個屬性的處理結果

基于Java的配置: Spring對Java配置的支持是由@Configuration注解和@Bean注解來實現的。由@Bean注解的方法將會實例化、配置和初始化一個新對象,這個對象將由Spring的IoC容器來管理。@Bean聲明所起到的作用與元素類似。被@Configuration所注解的類則表示這個類的主要目的是作為bean定義的資源。被@Configuration聲明的類可以通過在同一個類的內部調用@bean方法來設置嵌入bean的依賴關系。


Spring Bean的生命周期

Bean在Spring中的生命周期如下:

實例化。Spring通過new關鍵字將一個Bean進行實例化,JavaBean都有默認的構造函數,因此不需要提供構造參數。

填入屬性。Spring根據xml文件中的配置通過調用Bean中的setXXX方法填入對應的屬性。 事件通知。Spring依次檢查Bean是否實現了BeanNameAware、BeanFactoryAware、ApplicationContextAware、BeanPostProcessor、InitializingBean接口,如果有的話,依次調用這些接口。

使用。應用程序可以正常使用這個Bean了。

銷毀。如果Bean實現了DisposableBean接口,就調用其destroy方法。

---加載過程---?

1.容器尋找Bean的定義信息并且將其實例化。

?2.如果允許提前暴露工廠,則提前暴露這個bean的工廠,這個工廠主要是返回該未完全處理的bean.主要是用于避免單例屬性循環依賴問題.

?3.受用依賴注入,Spring按照Bean定義信息配置Bean的所有屬性。?

4.如果Bean實現了BeanNameAware接口,工廠調用Bean的setBeanName()方法傳遞Bean的ID。

5.如果Bean實現了BeanFactoryAware接口,工廠調用setBeanFactory()方法傳入工廠自身。?

6.如果BeanPostProcessor和Bean關聯,那么它們的postProcessBeforeInitialzation()方法將被調用。

?7.如果Bean指定了init-method方法,它將被調用。

8.如果有BeanPostProcessor和Bean關聯,那么它們的postProcessAfterInitialization()方法將被調用

9.最后如果配置了destroy-method方法則注冊DisposableBean.

到這個時候,Bean已經可以被應用系統使用了,并且將被保留在Bean Factory中知道它不再需要。 有兩種方法可以把它從Bean Factory中刪除掉。?

1.如果Bean實現了DisposableBean接口,destory()方法被調用。?

2.如果指定了訂制的銷毀方法,就調用這個方法。


Spring Bean的作用域之間有什么區別

singleton:這種bean范圍是默認的,這種范圍確保不管接受到多少個請求,每個容器中只有一個bean的實例,單例的模式由bean factory自身來維護。?

prototype:原形范圍與單例范圍相反,為每一個bean請求提供一個實例。

request:在請求bean范圍內會每一個來自客戶端的網絡請求創建一個實例,在請求完成以后,bean會失效并被垃圾回收器回收。?

Session:與請求范圍類似,確保每個session中有一個bean的實例,在session過期后,bean會隨之失效。?

global-session:global-session和Portlet應用相關。當你的應用部署在Portlet容器中工作時,它包含很多portlet。如果你想要聲明讓所有的portlet共用全局的存儲變量的話,那么這全局變量需要存儲在global-session中。


請解釋自動裝配模式的區別

no:這是Spring框架的默認設置,在該設置下自動裝配是關閉的,開發者需要自行在bean定義中用標簽明確的設置依賴關系。

byName**:該選項可以根據bean名稱設置依賴關系。當向一個bean中自動裝配一個屬性時,容器將根據bean的名稱自動在在配置文件中查詢一個匹配的bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。

byType:該選項可以根據bean類型設置依賴關系。當向一個bean中自動裝配一個屬性時,容器將根據bean的類型自動在在配置文件中查詢一個匹配的bean。如果找到的話,就裝配這個屬性,如果沒找到的話就報錯。

constructor:造器的自動裝配和byType模式類似,但是僅僅適用于與有構造器相同參數的bean,如果在容器中沒有找到與構造器參數類型一致的bean,那么將會拋出異常。

autodetect:該模式自動探測使用構造器自動裝配或者byType自動裝配。首先,首先會嘗試找合適的帶參數的構造器,如果找到的話就是用構造器自動裝配,如果在bean內部沒有找到相應的構造器或者是無參構造器,容器就會自動選擇byTpe的自動裝配方式。


Spring 框架中都用到了哪些設計模式

代理模式—在AOP和remoting中被用的比較多。

單例模式—在spring配置文件中定義的bean默認為單例模式。

模板方法—用來解決代碼重復的問題 比如. RestTemplate, JmsTemplate, JpaTemplate。 前端控制器—Srping提供了DispatcherServlet來對請求進行分發。 視圖幫助(View Helper )—Spring提供了一系列的JSP標簽,高效宏來輔助將分散的代碼整合在視圖里。 依賴注入—貫穿于BeanFactory / ApplicationContext接口的核心理念。

工廠模式—BeanFactory用來創建對象的實例。

Builder模式- 自定義配置文件的解析bean是時采用builder模式,一步一步地構建一個beanDefinition

策略模式:Spring 中策略模式使用有多個地方,如 Bean 定義對象的創建以及代理對象的創建等。這里主要看一下代理對象創建的策略模式的實現。 前面已經了解 Spring 的代理方式有兩個 Jdk 動態代理和 CGLIB 代理。這兩個代理方式的使用正是使用了策略模式。


AOP是怎么實現的

實現AOP的技術,主要分為兩大類:

一是采用動態代理技術,利用截取消息的方式,對該消息進行裝飾,以取代原有對象行為的執行;

二是采用靜態織入的方式,引入特定的語法創建“方面”,從而使得編譯器可以在編譯期間織入有關“方面”的代碼。

Spring AOP 的實現原理其實很簡單:AOP 框架負責動態地生成 AOP 代理類,這個代理類的方法則由 Advice 和回調目標對象的方法所組成,并將該對象可作為目標對象使用。AOP 代理包含了目標對象的全部方法,但 AOP 代理中的方法與目標對象的方法存在差異,AOP 方法在特定切入點添加了增強處理,并回調了目標對象的方法。?

Spring AOP使用動態代理技術在運行期織入增強代碼。使用兩種代理機制:

基于JDK的動態代理(JDK本身只提供接口的代理);

基于CGlib的動態代理

1)JDK的動態代理主要涉及java.lang.reflect包中的兩個類:Proxy和InvocationHandler。其中InvocationHandler只是一個接口,可以通過實現該接口定義橫切邏輯,并通過反射機制調用目標類的代碼,動態的將橫切邏輯與業務邏輯織在一起。而Proxy利用InvocationHandler動態創建一個符合某一接口的實例,生成目標類的代理對象。 其代理對象必須是某個接口的實現,它是通過在運行期間創建一個接口的實現類來完成對目標對象的代理.只能實現接口的類生成代理,而不能針對類

2)CGLib采用底層的字節碼技術,為一個類創建子類,并在子類中采用方法攔截的技術攔截所有父類的調用方法,并順勢織入橫切邏輯.它運行期間生成的代理對象是目標類的擴展子類.所以無法通知final的方法,因為它們不能被覆寫.是針對類實現代理,主要是為指定的類生成一個子類,覆蓋其中方法.

在spring中默認情況下使用JDK動態代理實現AOP,如果proxy-target-class設置為true或者使用了優化策略那么會使用CGLIB來創建動態代理.Spring AOP在這兩種方式的實現上基本一樣.以JDK代理為例,會使用JdkDynamicAopProxy來創建代理,在invoke()方法首先需要織入到當前類的增強器封裝到攔截器鏈中,然后遞歸的調用這些攔截器完成功能的織入.最終返回代理對象.

http://zhengjianglong.cn/2015/12/12/Spring/spring-source-aop/


介紹spring的IOC實現

Spring IOC主要負責創建和管理bean及bean之間的依賴關系.

Spring IOC的可分為:IOC容器的初始化和bean的加載.?

在IOC容器階段主要是完成資源的加載(如定義bean的xml文件),bean的解析及對解析后得到的beanDefinition的進行注冊.以xmlBeanFactory為例,XmlBeanFactory繼承了DefaultListableBeanFactory,XmlBeanFactory將讀取xml配置文件,解析bean和注冊解析后的beanDefinition工作交給XmlBeanDefinitionReader(是BeanDefinitionReader接口的一個個性化實現)來執行.spring中定義了一套資源類,將文件,class等都看做資源.?

1)所以首先是將xml文件轉化為資源然后用EncodeResouce來封裝,該功能主要時考慮Resource可能存在編碼要求的情況,如UTF-8等.

?2)然后根據xml文件判斷xml的約束模式,是DTD還是Schema,以及尋找模式文檔(驗證文件)的方法(EntityResolver,這部分采用了代理模式和策略模式). 完成了前面所有的準備工作以后就可以正式的加載配置文件,獲取Docoment和解析注冊BeanDefinition.Docoment的獲取以及BeanDefinition的解析注冊并不是由XmlBeanDefinitionReader完成,XmlBeanDefinitionReader只是將前面的工作完成以后文檔加載交給DefaultDocumentLoader類來完成.而解析交給了DefaultBeanDefinitionDocumentReader來處理.bean標簽可以分為兩種,一種是spring自帶的默認標簽,另一種就是用戶自定義的標簽.所以spring針對這兩種情況,提供了不同的解析方式. 每種bean的解析完成后都會先注冊到容器中然后最后發出響應事件,通知相關的監聽器這個bean已經注冊完成了.

bean的加載http://zhengjianglong.cn/2015/12/06/Spring/spring-source-ioc-bean-parse/


springMVC流程具體敘述下

當應用啟動時,容器會加載servlet類并調用init方法. 在這個階段,DispatcherServlet在init()完成初始化參數init-param的解析和封裝,相關配置,spring的WebApplicationContext的初始化即完成xml文件的加載,bean的解析和注冊等工作,另外為servlet功能所用的變量進行初始化,如:handlerMapping,viewResolvers等.

當用戶發送一個請求時,首先根據請求的類型調用DispatcherServlet不同的方法,這些方法都會轉發到doService()中執行.在該方法內部完成以下工作:?

1)spring首先考慮multipart的處理,如果是MultipartContent類型的request,則將該請求轉換成MultipartHttpServletRequest類型的request.?

2)根據request信息獲取對應的Handler. 首先根據request獲取訪問路徑,然后根據該路徑可以選擇直接匹配或通用匹配的方式尋找Handler,即用戶定義的controller. Handler在init()方法時已經完成加載且保存到Map中了,只要根據路徑就可以得到對應的Handler. 如果不存在則嘗試使用默認的Handler. 如果還是沒有找到那么就通過response向用戶返回錯誤信息.找到handler后會將其包裝在一個執行鏈中,然后將所有的攔截器也加入到該鏈中.?

4)如果存在handler則根據當前的handler尋找對應的HandlerAdapter. 通過遍歷所有適配器來選擇合適的適配器.?

5)SpringMVC允許你通過處理攔截器Web請求,進行前置處理和后置處理.所以在正式調用 Handler的邏輯方法時,先執行所有攔截器的preHandle()方法.?

6)正式執行handle的業務邏輯方法handle(),返回ModelAndView.邏輯處理是通過適配器調用handle并返回視圖.這過程其實是調用用戶controller的業務邏輯.?

8)調用攔截器的postHandle()方法,完成后置處理.?

9)根據視圖進行頁面跳轉.該過程首先會根據視圖名字解析得到視圖,該過程支持緩存,如果緩存中存在則直接獲取,否則創建新的視圖并在支持緩存的情況下保存到緩沖中.

10)過程完成了像添加前綴后綴,設置必須的屬性等工作.最后就是進行頁面跳轉處理.?

11)調用攔截器的afterComplection()


AOP相關概念

方面(Aspect):一個關注點的模塊化,這個關注點實現可能另外橫切多個對象。事務管理是J2EE應用中一個很好的橫切關注點例子。方面用Spring的 Advisor或攔截器實現。

連接點(Joinpoint): 程序執行過程中明確的點,如方法的調用或特定的異常被拋出。

通知(Advice):在特定的連接點,AOP框架執行的動作。各種類型的通知包括“around”、“before”和“throws”通知。通知類型將在下面討論。許多AOP框架包括Spring都是以攔截器做通知模型,維護一個“圍繞”連接點的攔截器鏈。Spring中定義了4個advice.Interception Around(MethodInterceptor)、Before(MethodBeforeAdvice)、After Returning(AfterReturningAdvice)、After(AfterAdvice)。

切入點(Pointcut): 一系列連接點的集合。AOP框架必須允許開發者指定切入點:例如,使用正則表達式。 Spring定義了Pointcut接口,用來組合MethodMatcher和ClassFilter,可以通過名字很清楚的理解, MethodMatcher是用來檢查目標類的方法是否可以被應用此通知,而ClassFilter是用來檢查Pointcut是否應該應用到目標類上

引入(Introduction): 添加方法或字段到被通知的類。 Spring允許引入新的接口到任何被通知的對象。例如,你可以使用一個引入使任何對象實現 IsModified接口,來簡化緩存。Spring中要使用Introduction, 可有通過DelegatingIntroductionInterceptor來實現通知,通過DefaultIntroductionAdvisor來配置Advice和代理類要實現的接口

目標對象(Target Object): 包含連接點的對象。也被稱作被通知或被代理對象。

POJOAOP代理(AOP Proxy): AOP框架創建的對象,包含通知。 在Spring中,AOP代理可以是JDK動態代理或者CGLIB代理。

織入(Weaving): 組裝方面來創建一個被通知對象。這可以在編譯時完成(例如使用AspectJ編譯器),也可以在運行時完成。Spring和其他純Java AOP框架一樣,在運行時完成織入。


過濾器與監聽器的區別

Filter可認為是Servlet的一種“變種”,它主要用于對用戶請求進行預處理,也可以對HttpServletResponse進行后處理,是個典型的處理鏈。它與Servlet的區別在于:它不能直接向用戶生成響應。完整的流程是:Filter對用戶請求進行預處理,接著將請求交給 Servlet進行處理并生成響應,最后Filter再對服務器響應進行后處理。 Java中的Filter 并不是一個標準的Servlet ,它不能處理用戶請求,也不能對客戶端生成響應。 主要用于對HttpServletRequest 進行預處理,也可以對HttpServletResponse 進行后處理,是個典型的處理鏈。優點:過濾鏈的好處是,執行過程中任何時候都可以打斷,只要不執行chain.doFilter()就不會再執行后面的過濾器和請求的內容。而在實際使用時,就要特別注意過濾鏈的執行順序問題http://blog.csdn.net/sd0902/article/details/8395641

Servlet,Filter都是針對url之類的,而Listener是針對對象的操作的,如session的創建,session.setAttribute的發生,或者在啟動服務器的時候將你需要的數據加載到緩存等,在這樣的事件發生時做一些事情。http://www.tuicool.com/articles/bmqMjm


請描述一下java事件監聽機制。

(1) Java的事件監聽機制涉及到三個組件:事件源、事件監聽器、事件對象?

(2) 當事件源上發生操作時,它將會調用事件監聽器的一個方法,并在調用這個方法時,會傳遞事件對象過來?

(3) 事件監聽器由開發人員編寫,開發人員在事件監聽器中,通過事件對象可以拿到事件源,從而對事件源上的操作進行處理。


解釋核心容器(應用上下文)模塊

這是Spring的基本模塊,它提供了Spring框架的基本功能。BeanFactory 是所有Spring應用的核心。Spring框架是建立在這個模塊之上的,這也使得Spring成為一個容器。


BeanFactory – BeanFactory 實例

BeanFactory是工廠模式的一種實現,它使用控制反轉將應用的配置和依賴與實際的應用代碼分離開來。最常用的BeanFactory實現是XmlBeanFactory類。

XmlBeanFactory

最常用的就是org.springframework.beans.factory.xml.XmlBeanFactory,它根據XML文件中定義的內容加載beans。該容器從XML文件中讀取配置元數據,并用它來創建一個完備的系統或應用。


解釋AOP模塊

AOP模塊用來開發Spring應用程序中具有切面性質的部分。該模塊的大部分服務由AOP Aliance提供,這就保證了Spring框架和其他AOP框架之間的互操作性。另外,該模塊將元數據編程引入到了Spring。


解釋抽象JDBC和DAO模塊

通過使用抽象JDBC和DAO模塊保證了與數據庫連接代碼的整潔與簡單,同時避免了由于未能關閉數據庫資源引起的問題。它在多種數據庫服務器的錯誤信息之上提供了一個很重要的異常層。它還利用Spring的AOP模塊為Spring應用程序中的對象提供事務管理服務。


解釋對象/關系映射集成模塊

Spring通過提供ORM模塊在JDBC的基礎上支持對象關系映射工具。這樣的支持使得Spring可以集成主流的ORM框架,包括Hibernate, JDO, 及iBATIS SQL Maps。Spring的事務管理可以同時支持以上某種框架和JDBC。


解釋web模塊

Spring的web模塊建立在應用上下文(application context)模塊之上,提供了一個適合基于web應用程序的上下文環境。該模塊還支持了幾個面向web的任務,如透明的處理多文件上傳請求及將請求參數同業務對象綁定起來。


解釋Spring MVC模塊

Spring提供MVC框架構建web應用程序。Spring可以很輕松的同其他MVC框架結合,但Spring的MVC是個更好的選擇,因為它通過控制反轉將控制邏輯和業務對象完全分離開來。


ContextLoaderListener是監聽什么事件

ContextLoaderListener的作用就是啟動Web容器時,自動裝配ApplicationContext的配置信息。因為它實現了ServletContextListener這個接口,在web.xml配置這個監聽器,啟動容器時,就會默認執行它實現的方法。


Spring IoC容器

Spring IOC負責創建對象、管理對象(通過依賴注入)、整合對象、配置對象以及管理這些對象的生命周期。


IOC有什么優點?

IOC或依賴注入減少了應用程序的代碼量。它使得應用程序的測試很簡單,因為在單元測試中不再需要單例或JNDI查找機制。簡單的實現以及較少的干擾機制使得松耦合得以實現。IOC容器支持勤性單例及延遲加載服務。


應用上下文是如何實現的?

ClassPathXmlApplicationContext 容器加載XML文件中beans的定義。XML Bean配置文件的完整路徑必須傳遞給構造器。 FileSystemXmlApplicationContext 容器也加載XML文件中beans的定義。注意,你需要正確的設置CLASSPATH,因為該容器會在CLASSPATH中查看bean的XML配置文件。 WebXmlApplicationContext:該容器加載xml文件,這些文件定義了web應用中所有的beans。


有哪些不同類型的IOC(依賴注入)

接口注入:接口注入的意思是通過接口來實現信息的注入,而其它的類要實現該接口時,就可以實現了注入 構造器依賴注入:構造器依賴注入在容器觸發構造器的時候完成,該構造器有一系列的參數,每個參數代表注入的對象。 Setter方法依賴注入:首先容器會觸發一個無參構造函數或無參靜態工廠方法實例化對象,之后容器調用bean中的setter方法完成Setter方法依賴注入。

你推薦哪種依賴注入?構造器依賴注入還是Setter方法依賴注入?

你可以同時使用兩種方式的依賴注入,最好的選擇是使用構造器參數實現強制依賴注入,使用setter方法實現可選的依賴關系。


什么是Spring Beans

Spring Beans是構成Spring應用核心的Java對象。這些對象由Spring IOC容器實例化、組裝、管理。這些對象通過容器中配置的元數據創建,例如,使用XML文件中定義的創建。 在Spring中創建的beans都是單例的beans。在bean標簽中有一個屬性為”singleton”,如果設為true,該bean是單例的,如果設為false,該bean是原型bean。Singleton屬性默認設置為true。因此,spring框架中所有的bean都默認為單例bean。


Spring Bean中定義了什么內容?

Spring Bean中定義了所有的配置元數據,這些配置信息告知容器如何創建它,它的生命周期是什么以及它的依賴關系。


如何向Spring 容器提供配置元數據

有三種方式向Spring 容器提供元數據: XML配置文件 基于注解配置 基于Java的配置


你如何定義bean的作用域

在Spring中創建一個bean的時候,我們可以聲明它的作用域。只需要在bean定義的時候通過’scope’屬性定義即可。例如,當Spring需要產生每次一個新的bean實例時,應該聲明bean的scope屬性為prototype。如果每次你希望Spring返回一個實例,應該聲明bean的scope屬性為singleton。


Spring框架中單例beans是線程安全的嗎?

不是,Spring框架中的單例beans不是線程安全的。


哪些是最重要的bean生命周期方法?能重寫它們嗎?

有兩個重要的bean生命周期方法。第一個是setup方法,該方法在容器加載bean的時候被調用。第二個是teardown方法,該方法在bean從容器中移除的時候調用。 bean標簽有兩個重要的屬性(init-method 和 destroy-method),你可以通過這兩個屬性定義自己的初始化方法和析構方法。Spring也有相應的注解:@PostConstruct 和 @PreDestroy。


什么是Spring的內部bean

當一個bean被用作另一個bean的屬性時,這個bean可以被聲明為內部bean。在基于XML的配置元數據中,可以通過把元素定義在 或元素內部實現定義內部bean。內部bean總是匿名的并且它們的scope總是prototype。


如何在Spring中注入Java集合類

Spring提供如下幾種類型的集合配置元素: list元素用來注入一系列的值,允許有相同的值。 set元素用來注入一些列的值,不允許有相同的值。 map用來注入一組”鍵-值”對,鍵、值可以是任何類型的。 props也可以用來注入一組”鍵-值”對,這里的鍵、值都字符串類型。


什么是bean wiring?

Wiring,或者說bean Wiring是指beans在Spring容器中結合在一起的情況。當裝配bean的時候,Spring容器需要知道需要哪些beans以及如何使用依賴注入將它們結合起來。


什么是bean自動裝配?

Spring容器可以自動配置相互協作beans之間的關聯關系。這意味著Spring可以自動配置一個bean和其他協作bean之間的關系,通過檢查BeanFactory 的內容里沒有使用和< property>元素。


解釋自動裝配的各種模式

自動裝配提供五種不同的模式供Spring容器用來自動裝配beans之間的依賴注入: no:默認的方式是不進行自動裝配,通過手工設置ref 屬性來進行裝配bean。 byName:通過參數名自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置為byName。之后容器試圖匹配、裝配和該bean的屬性具有相同名字的bean。 byType:通過參數的數據類型自動自動裝配,Spring容器查找beans的屬性,這些beans在XML配置文件中被設置為byType。之后容器試圖匹配和裝配和該bean的屬性類型一樣的bean。如果有多個bean符合條件,則拋出錯誤。 constructor:這個同byType類似,不過是應用于構造函數的參數。如果在BeanFactory中不是恰好有一個bean與構造函數參數相同類型,則拋出一個嚴重的錯誤。 autodetect:如果有默認的構造方法,通過 construct的方式自動裝配,否則使用 byType的方式自動裝配。


自動裝配有哪些局限性?

自動裝配有如下局限性: 重寫:你仍然需要使用 和< property>設置指明依賴,這意味著總要重寫自動裝配。 原生數據類型:你不能自動裝配簡單的屬性,如原生類型、字符串和類。 模糊特性:自動裝配總是沒有自定義裝配精確,因此,如果可能盡量使用自定義裝配。


你可以在Spring中注入null或空字符串嗎

完全可以。


什么是Spring基于Java的配置?給出一些注解的例子

基于Java的配置允許你使用Java的注解進行Spring的大部分配置而非通過傳統的XML文件配置。以注解@Configuration為例,它用來標記類,說明作為beans的定義,可以被Spring IOC容器使用。另一個例子是@Bean注解,它表示該方法定義的Bean要被注冊進Spring應用上下文中。


什么是基于注解的容器配置

另外一種替代XML配置的方式為基于注解的配置,這種方式通過字節元數據裝配組件而非使用尖括號聲明。開發人員將直接在類中進行配置,通過注解標記相關的類、方法或字段聲明,而不再使用XML描述bean之間的連線關系。


如何開啟注解裝配?

注解裝配默認情況下在Spring容器中是不開啟的。如果想要開啟基于注解的裝配只需在Spring配置文件中配置元素即可。


@Required 注解

@Required表明bean的屬性必須在配置時設置,可以在bean的定義中明確指定也可通過自動裝配設置。如果bean的屬性未設置,則拋出BeanInitializationException異常。


@Autowired 注解

@Autowired 注解提供更加精細的控制,包括自動裝配在何處完成以及如何完成。它可以像@Required一樣自動裝配setter方法、構造器、屬性或者具有任意名稱和/或多個參數的PN方法。


@Qualifier 注解

當有多個相同類型的bean而只有其中的一個需要自動裝配時,將@Qualifier 注解和@Autowire 注解結合使用消除這種混淆,指明需要裝配的bean。 Spring數據訪問


在Spring框架中如何更有效的使用JDBC?

使用Spring JDBC框架,資源管理以及錯誤處理的代價都會減輕。開發人員只需通過statements和queries語句從數據庫中存取數據。Spring框架中通過使用模板類能更有效的使用JDBC,也就是所謂的JdbcTemplate。


JdbcTemplate

JdbcTemplate類提供了許多方法,為我們與數據庫的交互提供了便利。例如,它可以將數據庫的數據轉化為原生類型或對象,執行寫好的或可調用的數據庫操作語句,提供自定義的數據庫錯誤處理功能。


Spring對DAO的支持

Spring對數據訪問對象(DAO)的支持旨在使它可以與數據訪問技術(如 JDBC, Hibernate 及JDO)方便的結合起來工作。這使得我們可以很容易在的不同的持久層技術間切換,編碼時也無需擔心會拋出特定技術的異常。


使用Spring可以通過什么方式訪問Hibernate?

使用Spring有兩種方式訪問Hibernate: 使用Hibernate Template的反轉控制以及回調方法 繼承HibernateDAOSupport,并申請一個AOP攔截器節點


Spring支持的ORM

Spring支持一下ORM: Hibernate iBatis JPA (Java -Persistence API) TopLink JDO (Java Data Objects) OJB


如何通過HibernateDaoSupport將Spring和Hibernate結合起來?

使用Spring的SessionFactory 調用LocalSessionFactory。結合過程分為以下三步: 配置Hibernate SessionFactory 繼承HibernateDaoSupport實現一個DAO 使用AOP裝載事務支持


Spring支持的事務管理類型

Spring支持如下兩種方式的事務管理: 編碼式事務管理:sping對編碼式事務的支持與EJB有很大區別,不像EJB與java事務API耦合在一起.spring通過回調機制將實際的事務實現從事務性代碼中抽象出來.你能夠精確控制事務的邊界,它們的開始和結束完全取決于你. 聲明式事務管理:這種方式意味著你可以將事務管理和業務代碼分離。你只需要通過注解或者XML配置管理事務。通過傳播行為,隔離級別,回滾規則,事務超時,只讀提示來定義.


Spring框架的事務管理有哪些優點

它為不同的事務API(如JTA, JDBC, Hibernate, JPA, 和JDO)提供了統一的編程模型。 它為編程式事務管理提供了一個簡單的API而非一系列復雜的事務API(如JTA). 它支持聲明式事務管理。 它可以和Spring 的多種數據訪問技術很好的融合。


ACID

原子性(Atomic):一個操作要么成功,要么全部不執行.

一致性(Consistent): 一旦事務完成,系統必須確保它所建模業務處于一致的狀態

隔離性(Isolated): 事務允許多個用戶對相同的數據進行操作,每個用戶用戶的操作相互隔離互補影響.

持久性(Durable): 一旦事務完成,事務的結果應該持久化.


spring事務定義的傳播規則

PROPAGATION_REQUIRED–支持當前事務,如果當前沒有事務,就新建一個事務。這是最常見的選擇。?

PROPAGATION_SUPPORTS–支持當前事務,如果當前沒有事務,就以非事務方式執行。?

PROPAGATION_MANDATORY–支持當前事務,如果當前沒有事務,就拋出異常。?

PROPAGATION_REQUIRES_NEW–新建事務,如果當前存在事務,把當前事務掛起。?

PROPAGATION_NOT_SUPPORTED–以非事務方式執行操作,如果當前存在事務,就把當前事務掛起。

PROPAGATION_NEVER–以非事務方式執行,如果當前存在事務,則拋出異常。?

PROPAGATION_NESTED–如果當前存在事務,則在嵌套事務內執行。如果當前沒有事務,則進行與PROPAGATION_REQUIRED類似的操作。


spring事務支持的隔離級別

并發會導致以下問題:?

藏讀:發生在一個事務讀取了另一個事務改寫但尚未提交的數據.?

不可重復讀:在一個事務執行相同的查詢兩次或兩次以上,每次得到的數據不同.?

幻讀:與不可重復讀類似,發生在一個事務讀取多行數據,接著另一個并發事務插入一些數據,隨后查詢中,第一個事務發現多了一些原本不存在的數據.?

spring 事務上提供以下的隔離級別:?

ISOLATION_DEFAULT: 使用后端數據庫默認的隔離級別?

ISOLATION_READ_UNCOMMITTED : 允許讀取未提交的數據變更,可能會導致臟讀,幻讀或不可重復讀

?ISOLATION_READ_COMMITTD : 允許讀取為提交數據,可以阻止臟讀,當時幻讀或不可重復讀仍可能發生

?ISOLATION_REPEATABLE_READ: 對統一字段多次讀取結果是一致的,除非數據是被本事務自己修改.可以阻止臟讀,不可重復讀,但幻讀可能發生?

ISOLATION_SERIALIZABLE : 完全服從ACID


你更推薦那種類型的事務管理?

許多Spring框架的用戶選擇聲明式事務管理,因為這種方式和應用程序的關聯較少,因此更加符合輕量級容器的概念。聲明式事務管理要優于編程式事務管理,盡管在靈活性方面它弱于編程式事務管理(這種方式允許你通過代碼控制業務)。


有幾種不同類型的自動代理?

BeanNameAutoProxyCreator:bean名稱自動代理創建器 DefaultAdvisorAutoProxyCreator:默認通知者自動代理創建器 Metadata autoproxying:元數據自動代理


什么是織入?什么是織入應用的不同點?

織入是將切面和其他應用類型或對象連接起來創建一個通知對象的過程。織入可以在編譯、加載或運行時完成。


什么是Spring的MVC框架?

Spring提供了一個功能齊全的MVC框架用于構建Web應用程序。Spring框架可以很容易的和其他的MVC框架融合(如Struts),該框架使用控制反轉(IOC)將控制器邏輯和業務對象分離開來。它也允許以聲明的方式綁定請求參數到業務對象上。


DispatcherServlet

Spring的MVC框架圍繞DispatcherServlet來設計的,它用來處理所有的HTTP請求和響應。


WebApplicationContext

WebApplicationContext繼承了ApplicationContext,并添加了一些web應用程序需要的功能。和普通的ApplicationContext 不同,WebApplicationContext可以用來處理主題樣式,它也知道如何找到相應的servlet。


什么是Spring MVC框架的控制器?

控制器提供對應用程序行為的訪問,通常通過服務接口實現。控制器解析用戶的輸入,并將其轉換為一個由視圖呈現給用戶的模型。Spring 通過一種極其抽象的方式實現控制器,它允許用戶創建多種類型的控制器。

@Controller annotation

@Controller注解表示該類扮演控制器的角色。Spring不需要繼承任何控制器基類或應用Servlet API。

@RequestMapping annotation

@RequestMapping注解用于將URL映射到任何一個類或者一個特定的處理方法上。


最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,401評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,011評論 3 413
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,263評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,543評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,323評論 6 404
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,874評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 42,968評論 3 439
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,095評論 0 286
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,605評論 1 331
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,551評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,720評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,242評論 5 355
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 43,961評論 3 345
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,358評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,612評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,330評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,690評論 2 370

推薦閱讀更多精彩內容