1、Spring的理解web
Spring是一個輕量級的容器,非侵入性的框架.最重要的核心概念是IOC,並提供AOP概念的實現方式,提供對持久層,事務的支持,對當前流行的一些框架(Struts,Hibernate,MVC),Sping也提供了與它們的相整合的方案. 使用Spring,咱們可以減小類之間的依賴性和程序之間的耦合度,最大程度的實現鬆耦合,使程序更加靈活,可擴展性更強.ajax
IOC,中文翻譯爲"反轉控制,".DI->;"依賴注入"指的是:咱們沒必要本身在程序代碼中維護對象的依賴關係,而是經過一個xml配置文件,將類的屬性和實例悄悄的注入到類裏面.實現類的動態加載,使得類和類之間能夠方便的切換(經過接口).spring
這種設計方式的思想表現爲:高層模塊不該該依賴低層模塊,而是模塊都必須依賴於抽象.程序不該改依賴於實現,而是依賴於抽象接口.應用程序不要去找容器,而是容器給咱們全部想要的對象.數據庫
Spring的另外一個重要的方面是支持AOP的實現: AOP的中文翻譯是:面向切面編程.編程
面向切面編程(aop)是對面向對象編程(oop)的補充, 面向對象編程將程序分解成各個層次的對象,面向切面編程將程序運行過程分解成各個切面。AOP從程序運行角度考慮程序的結構,提取業務處理過程的切面,oop是靜態的抽象,aop是動態的抽象,是對應用執行過程當中的步驟進行抽象,從而得到步驟之間的邏輯劃分。緩存
aop框架具備的兩個特徵: 1.各個步驟之間的良好隔離性2.源代碼無關性安全
2、Spring 註解restful
Spring 2.5 中除了提供 @Component 註釋外,還定義了幾個擁有特殊語義的註釋,它們分別是:@Repository、@Service 和 @Controller。在目前的 Spring 版本中,這 3 個註釋和 @Component 是等效的,可是從註釋類的命名上,很容易看出這 3 個註釋分別和持久層、業務層和控制層(Web 層)相對應。雖然目前這 3 個註釋和 @Component 相比沒有什麼新意,但 Spring 將在之後的版本中爲它們添加特殊的功能。因此,若是 Web 應用程序採用了經典的三層分層結構的話,最好在持久層、業務層和控制層分別採用 @Repository、@Service 和 @Controller 對分層中的類進行註釋,而用 @Component 對那些比較中立的類進行註釋。架構
在一個稍大的項目中,一般會有上百個組件,若是這些組件採用xml的bean定義來配置,顯然會增長配置文件的體積,查找以及維護起來也不太方便。 Spring2.5爲咱們引入了組件自動掃描機制,他能夠在類路徑底下尋找標註了 @Component,@Service,@Controller,@Repository註解的類,並把這些類歸入進spring容器中管理。它的做用和在xml文件中使用bean節點配置組件時同樣的。mvc
@Service用於標註業務層組件, @Controller用於標註控制層組件(如struts中的action), @Repository用於標註數據訪問組件,即DAO組件, @Component泛指組件,當組件很差歸類的時候,咱們可使用這個註解進行標註。
3、spring 的優勢都有哪些?
ioc 解耦,提升了代碼的複用性,管理對象的生命週期,不會形成對象重複建立的過程,節省了jvm的內存消耗,對事物的管理,提供了對不少其餘框架的支持
4、bean的生命週期
這Spring框架中,一旦把一個bean歸入到Spring IoC容器之中,這個bean的生命週期就會交由容器進行管理,通常擔當管理者角色的是BeanFactory或ApplicationContext。認識一下Bean的生命週期活動,對更好的利用它有很大的幫助。
由BeanFactory讀取Bean定義文件,並生成各個實例。
執行Bean的屬性依賴注入。
若是Bean類實現了org.springframework.beans.factory.BeanNameAware接口,則執行其setBeanName()方法。
若是Bean類實現了org.springframework.beans.factory.BeanFactoryAware接口,則執行其setBeanFactory()方法。
容器中若是有實現org.springframework.beans.factory.BeanPostProcessors接口的實例,則任何Bean在初始化以前都會執行這個實例的processBeforeInitialization()方法。
若是Bean類實現了org.springframework.beans.factory.InitializingBean接口,則執行其afterPropertiesSet()方法。
在Bean定義文件中使用「init-method」屬性設定方法名稱,以下:
<bean id="demoBean" class="com.yangsq.bean.DemoBean" init-method="initMethod"> ....... </bean> |
這時會執行initMethod()方法,注意,這個方法是不帶參數的。
容器中若是有實現org.springframework.beans.factory.BeanPostProcessors接口的實例,則任何Bean在初始化以前都會執行這個實例的processAfterInitialization()方法。
在容器關閉時,若是Bean類實現了org.springframework.beans.factory.DisposableBean接口,則執行它的destroy()方法。
在容器關閉時,能夠在Bean定義文件中使用「destory-method」定義的方法
<bean id="demoBean" class="com.yangsq.bean.DemoBean" destory-method="destroyMethod"> ....... </bean> |
這時會執行destroyMethod()方法,注意,這個方法是不帶參數的。
5、Spring裏面如何配置數據庫驅動?
使用」org.springframework.jdbc.datasource.DriverManagerDataSource」數據源來配置數據庫驅動。
6、Spring裏面applicationContext.xml文件能不能改爲其餘文件名?
ContextLoaderListener是一個ServletContextListener, 它在你的web應用啓動的時候初始化。缺省狀況下,它會在WEB-INF/applicationContext.xml文件找Spring的配置。你能夠經過定義一個元素名字爲」contextConfigLocation」來改變Spring配置文件的位置。示例以下:
org.springframework.web.context.ContextLoaderListener contextConfigLocation /WEB-INF/xyz.xml
7、AOP裏面重要的幾個名詞概念解釋
切面(Aspect):一個關注點的模塊化,這個關注點可能會橫切多個對象。事務管理是J2EE應用中一個關於橫切關注點的很好的例子。 在Spring AOP中,切面可使用通用類(基於模式的風格) 或者在普通類中以 @Aspect 註解(@AspectJ風格)來實現。
鏈接點(Joinpoint): 在程序執行過程當中某個特定的點,好比某方法調用的時候或者處理異常的時候。 在Spring AOP中,一個鏈接點 老是 表明一個方法的執行。經過聲明一個org.aspectj.lang.JoinPoint類型的參數可使通知(Advice)的主體部分得到鏈接點信息。
通知(Advice):在切面的某個特定的鏈接點(Joinpoint)上執行的動做。通知有各類類型,其中包括「around」、「before」和「after」等通知。通知的類型將在後面部分進行討論。許多AOP框架,包括Spring,都是以攔截器作通知模型,並維護一個以鏈接點爲中心的攔截器鏈。
切入點(Pointcut):匹配鏈接點(Joinpoint)的斷言。通知和一個切入點表達式關聯,並在知足這個切入點的鏈接點上運行(例如,當執行某個特定名稱的方法時)。切入點表達式如何和鏈接點匹配是AOP的核心:Spring缺省使用AspectJ切入點語法。
引入(Introduction): (也被稱爲內部類型聲明(inter-type declaration))。聲明額外的方法或者某個類型的字段。 Spring容許引入新的接口(以及一個對應的實現)到任何被代理的對象。例如,你可使用一個引入來使bean實現 IsModified 接口,以便簡化緩存機制。
目標對象(Target Object): 被一個或者多個切面(aspect)所通知(advise)的對象。也有人把它叫作被通知(advised) 對象。 既然Spring AOP是經過運行時代理實現的,這個對象永遠是一個 被代理(proxied)對象。
AOP代理(AOP Proxy): AOP框架建立的對象,用來實現切面契約(aspect contract)(包括通知方法執行等功能)。 在Spring中,AOP代理能夠是JDK動態代理或者CGLIB代理。注意:Spring 2.0最新引入的基於模式(schema-based)風格和@AspectJ註解風格的切面聲明,對於使用這些風格的用戶來講,代理的建立是透明的。
織入(Weaving): 把切面(aspect)鏈接到其它的應用程序類型或者對象上,並建立一個被通知(advised)的對象。這些能夠在編譯時(例如使用AspectJ編譯器),類加載時和運行時完成。 Spring和其餘純Java AOP框架同樣,在運行時完成織入。
通知的類型:
前置通知(Before advice): 在某鏈接點(join point)以前執行的通知,但這個通知不能阻止鏈接點前的執行(除非它拋出一個異常)。
返回後通知(After returning advice): 在某鏈接點(join point)正常完成後執行的通知:例如,一個方法沒有拋出任何異常,正常返回。
拋出異常後通知(After throwing advice): 在方法拋出異常退出時執行的通知。
後通知(After (finally) advice): 當某鏈接點退出的時候執行的通知(不管是正常返回仍是異常退出)。
環繞通知(Around Advice): 包圍一個鏈接點(join point)的通知,如方法調用。這是最強大的一種通知類型。環繞通知能夠在方法調用先後完成自定義的行爲。它也會選擇是否繼續執行鏈接點或直接返回它們本身的返回值或拋出異常來結束執行。
環繞通知是最經常使用的一種通知類型。大部分基於攔截的AOP框架,例如Nanning和JBoss4,都只提供環繞通知。
切入點(pointcut)和鏈接點(join point)匹配的概念是AOP的關鍵,這使得AOP不一樣於其它僅僅提供攔截功能的舊技術。切入點使得定位通知(advice)可獨立於OO層次。例如,一個提供聲明式事務管理的around通知能夠被應用到一組橫跨多個對象中的方法上(例如服務層的全部業務操做)。
ioc:
2. 線程安全:struts2線程安全,springmvc線程不安全
3. 參數傳遞:sturts是基於類,每次發一次請求都會實例一個action,而後調用setter getter方法把request中的數據注入.一個Action對象對應一個request上下文。
spring3 mvc是方法級別的攔截,攔截到方法後根據參數上的註解,把request數據經過反射注入進去,一個方法對應一個request上下文。
4. 設計思想上:struts更加符合oop的編程思想, spring就比較謹慎,在servlet上擴展。
5. intercepter的實現機制:struts有以本身的interceptor機制,spring mvc用的是獨立的AOP方式。這樣致使struts的配置文件量仍是比spring mvc大,雖然struts的配置能繼承,因此我以爲論使用上來說,spring mvc使用更加簡潔,開發效率Spring MVC確實比struts2高。
spring mvc是方法級別的攔截,一個方法對應一個request上下文,而方法同時又跟一個url對應,因此說從架構自己上spring3 mvc就容易實現restful url。 struts2是類級別的攔截,一個類對應一個request上下文;實現restful url要費勁,由於struts2 action的一個方法能夠對應一個url;而其類屬性卻被全部方法共享,這也就沒法用註解或其餘方式標識其所屬方法了。
spring3 mvc的方法之間基本上獨立的,獨享request response數據,請求數據經過參數獲取,處理結果經過ModelMap交回給框架方法之間不共享變量,而struts2搞的就比較亂,雖然方法之間也是獨立的,但其全部Action變量是共享的,這不會影響程序運行,卻給咱們編碼,讀程序時帶來麻煩。
6. 另外,spring3 mvc的驗證也是一個亮點,支持JSR303,處理ajax的請求更是方便,只需一個註解@ResponseBody ,而後直接返回響應文本便可。