【面試】【Spring常見問題總結】【06】
【常見面試問題總結文件夾>>>】
51、spring中的applicationContext.xml能不能改為其它名字
ContextLoaderListener是一個ServletContextListener, 它在你的web應用啟動的時候初始化。缺省情況下,它會在WEB-INF/applicationContext.xml文件找Spring的配置。 你能夠通過定義一個<context-param>元素名字為”contextConfigLocation”來改變Spring配置文件的位置。示比例如以下:
<span style="font-size:14px;"><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/xyz.xml</param-value> </context-param> </listener></span>
52、在web中怎樣配置spring
在J2EE的web應用裏面配置spring很easy。僅僅須要把spring得ContextLoaderListener加入到你的web.xml文件中面就能夠了,示比例如以下:
<span style="font-size:14px;"><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener></span>
53、Spring中BeanFactory和ApplicationContext的作用和差別
BeanFactory負責讀取bean配置文檔,管理bean的載入,實例化,維護bean之間的依賴關系,負責bean的聲明周期。
ApplicationContext除了提供上述BeanFactory所能提供的功能之外,還提供了更完整的框架功能:
a. 國際化支持
b. 資源訪問:Resource rs = ctx. getResource(“classpath:config.properties”),
“file:c:/config.properties”
c. 事件傳遞:通過實現ApplicationContextAware接口。
54、經常使用的獲取ApplicationContext的方法
FileSystemXmlApplicationContext:
從文件系統或者url指定的xml配置文件創建,參數為配置文件名稱或文件名稱數組
ClassPathXmlApplicationContext:
從classpath的xml配置文件創建,能夠從jar包中讀取配置文件
WebApplicationContextUtils:
從web應用的根文件夾讀取配置文件,須要先在web.xml中配置,能夠配置監聽器或者servlet來實現
<span style="font-size:14px;"><listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener> <servlet> <servlet-name>context</servlet-name> <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet></span>
這兩種方式都默認配置文件為web-inf/applicationContext.xml,也可使用context-param指定配置文件
<span style="font-size:14px;"><context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/myApplicationContext.xml</param-value> </context-param></span>
55、spring中的jdbc與傳統的jdbc有什麽差別?
Spring的JDBC是在原生態JDBC上面的一層簡單的封裝,提供了一些一用的接口,節省代碼。無論連接(Connection),無論事務、無論異常、無論關閉(con.close() ps.close )。僅僅須要實現Spring提供的回調類。
傳統的JDBC運行步驟例如以下:
a、創建連接
b、創建語句(SQL)
c、運行語句
d、返回結果集(設置到JavaBean中等處理)
e、關閉連接釋放資源
Spring JDBC僅僅須要實現b和d兩個步驟,其它的都由Spring替你完畢。而b和d都是通過實現指定的接口。然後將實現類傳遞給Spring就OK了。
56、什麽是spring,它有什麽特點?
Spring是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架。
輕量——從大小與開銷雙方面而言Spring都是輕量的。完整的Spring框架能夠在一個大小僅僅有幾MB多的JAR文件中公布。
而且Spring所需的處理開銷也是微不足道的。
此外,Spring是非侵入式的(侵入式讓用戶代碼產生對框架的依賴,這些代碼不能在框架外使用,不利於代碼的復用。但侵入式能夠使用戶跟框架更好的結合。更easy更充分的利用框架提供的功能。非侵入式的代碼則沒有過多的依賴,能夠非常方便的遷移到其它地方。可是與用戶代碼互動的方式可能就比較復雜。):典型地,Spring應用中的對象不依賴於Spring的特定類。
控制反轉——Spring通過一種稱作控制反轉(IoC)的技術促進了松耦合。當應用IoC,一個對象依賴的其他對象會通過被動的方式傳遞進來,而不是這個對象自己創建或者查找依賴對象。你能夠覺得IoC與JNDI相反——不是對象從容器中查找依賴。而是容器在對象初始化時不等對象請求就主動將依賴傳遞給它。
面向切面——Spring提供了面向切面編程的豐富支持。同意通過分離應用的業務邏輯與系統級服務(比如審計(auditing)和事務(transacntion)管理)進行內聚性的開發。
應用對象僅僅實現它們應該做的——完畢業務邏輯——僅此而已。它們並不負責(甚至是意識)其他的系統級關註點。比如日誌或事務支持。
容器——Spring包括並管理應用對象的配置和生命周期。在這個意義上它是 一種容器,你能夠配置你的每一個bean怎樣被創建——基於一個可配置原型(prototype),你的bean能夠創建一個單獨的實例或者每次須要時都生成一個新的實例——以及它們是怎樣相互關聯的。
然而,Spring不應該被混同於傳統的重量級的EJB容器,它們常常是龐大與笨重的,難以使用。
框架——Spring能夠將簡單的組件配置、組合成為復雜的應用。在Spring中,應用對象被聲明式地組合,典型地是在一個XML文件中。Spring也提供了非常多基礎功能(事務管理、持久化框架集成等等)。將應用邏輯的開發留給了你。
56、使用spring有什麽優點?
l Spring能有效地組織你的中間層對象。
l Spring能消除在很多project上對Singleton的過多使用。
l Spring能消除使用各種各樣格式的屬性定制文件的須要,在整個應用和project中,可通過一種 一致的方法來進行配置。通過Spring,能夠非常easy地看到類的JavaBean屬性。依賴註入的使用幫助完畢這樣的簡化。
l Spring能通過接口而不是類促進好的編程習慣,降低編程代價到差點兒為零。
l Spring被設計為讓使用它創建的應用盡可能少的依賴於他的APIs。在Spring應用中的大多數業務對象沒有依賴於Spring。
l 使用Spring構建的應用程序易於單元測試。
l Spring能使EJB的使用成為一個實現選擇,而不是應用架構的必定選擇。你能選擇用POJOs或local EJBs來實現業務接口。卻不會影響調用代碼。
l Spring幫助你解決很多問題而無需使用EJB。
Spring能提供一種EJB的替換物,它們適於很多web應用。比如,Spring能使用AOP提供聲明性事務而不通過使用EJB容器,假設你只須要與單個的數據庫打交道,甚至不須要JTA實現。
l Spring為數據存取提供了一致的框架,不論是使用JDBC或O/R mapping產品(如Hibernate)。
總結起來,Spring有例如以下長處:
l 低侵入式設計,代碼汙染極低
l 獨立於各種應用server,能夠真正實現Write Once, Run Anywhere的承諾
l Spring的DI機制減少了業務對象替換的復雜性
l Spring並不全然依賴於Spring,開發人員可自由選用Spring框架的部分或所有。
57、談談Spring框架幾個主要部分組成?
l Spring框架有七個模塊組成組成,這7個模塊(或組件)均能夠單獨存在。也能夠與其他一個或多個模塊聯合使用,主要功能表現例如以下:
l Spring 核心容器(Core):提供Spring框架的基本功能。核心容器的主要組件是BeanFactory。她是工廠模式的實現。BeanFactory使用控制反轉(Ioc)模式將應用程序的配置和依賴性規範與實際的應用代碼程序分開。
l Spring AOP:通過配置管理特性,Spring AOP模塊直接面向方面的編程功能集成到了Spring框架中,所以能夠非常easy的使Spring框架管理的不論什麽對象支持 AOP。Spring AOP模塊為基於Spring的應用程序中的對象提供了事務管理服務。
通過使用Spring AOP,不用依賴於EJB組件,就能夠將聲明性事務管理集成到應用程序中。
l Spring ORM:Spring框架集成了若幹ORM框架,從而提供了ORM的對象關系工具,當中包含 JDO、Hibernate、myBatis和TopLink。
全部這些都遵從Spring的通用事務和DAO異常層結構。
l Spring DAO:JDBC DAO抽象層提供了有意義的異常層次的結構,可用該結構來管理異常處理和不同數據供應商拋出的異常錯誤信息。異常層次結構簡化了錯誤處理,而且大大的減少了須要編寫的異常代碼數量(比如。打開和關系連接)。Spring DAO的面向JDBC的異常遵從通用的DAO異常層結構。
l Spring WEB:Web上下文模塊建立在上下文模塊(Context)的基礎之上,為基於Web服務的應用程序提供了上下文的服務。所以Spring框架支持 Jakarta Struts的集成。
Web模塊還簡化了處理多部分請求及將請求參數綁定到域對象的工作。
l Spring上下文(Context):Spring上下文是一個配置文件,向Spring框架提供上下文信息。
Spring上下文包含企業服務。比如JNDI、EJB、電子郵件、國際化校驗和調度功能。
l Spring MVC:Spring的MVC框架是一個全功能的構建Web應用程序的MVC實現。
通過策略接口。MVC框架變成為高度可配置的,MVC容納的大量視圖技術。包含JSP、Velocity、Tiles、iText和Pol。
57、ApplicationContext接口獲取Bean方法簡單介紹:
l Object getBean(String name) 依據名稱返回一個Bean。client須要自己進行類型轉換。
l T getBean(String name,Class<T> requiredType) 依據名稱和指定的類型返回一個Bean,client無需自己進行類型轉換,假設類型轉換失敗。容器拋出異常。
l T getBean(Class<T> requiredType)依據指定的類型返回一個Bean,client無需自己進行類型轉換。假設沒有或有多於一個Bean存在容器將拋出異常。
l Map<String, T>getBeansOfType(Class<T> type) 依據指定的類型返回一個鍵值為名字和值為Bean對象的 Map,假設沒有Bean對象存在則返回空的Map。
58、Bean的命名
每一個Bean能夠有一個或多個id(或稱之為標識符或名字),在這裏我們把第一個id稱為“標識符”。其余id叫做“別名”;這些id在IoC容器中必須唯一。怎樣為Bean指定id呢,有下面幾種方式。
l 不指定id,僅僅配置必須的全限定類名,由IoC容器為其生成一個標識,client必須通過接口“T getBean(Class<T>requiredType)”獲取Bean。
<span style="font-size:14px;"><bean class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/></span>
l 指定id。必須在Ioc容器中唯一;
<span style="font-size:14px;"><bean id=” bean” class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/></span>
l 指定name,這樣name就是“標識符”,必須在Ioc容器中唯一。
<span style="font-size:14px;"><bean name=” bean” class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/></span>l 指定id和name,id就是標識符。而name就是別名,必須在Ioc容器中唯一
<span style="font-size:14px;"><bean id=”bean1” name=”alias1” class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/> <!-- 假設id和name一樣,IoC容器能檢測到。並消除沖突 --> <bean id="bean3" name="bean3" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/> </span>l 指定多個name,多個name用“,”、“;”、“”切割,第一個被用作標識符,其它的(alias1、alias2、alias3)是別名,全部標識符也必須在Ioc容器中唯一;
<bean name=” bean1;alias11,alias12;alias13 alias14”class=” cn.javass.spring.chapter2.helloworld.HelloImpl”/>
<span style="font-size:14px;"><!-- 當指定id時。name指定的標識符所有為別名 --> <bean id="bean2" name="alias21;alias22" class="cn.javass.spring.chapter2.helloworld.HelloImpl"/> </span>
59、Bean命名約定
Bean的命名遵循XML命名規範,但最好符合Java命名規範,由“字母、數字、下劃線組成“,並且應該養成一個良好的命名習慣, 比方採用“駝峰式”,即第一個單詞首字母開始,從第二個單詞開始首字母大寫開始,這樣能夠添加可讀性。
60、Spring IoC容器怎樣實例化Bean呢?
1、使用構造器實例化Bean:
使用空構造器進行定義,使用此種方式。class屬性指定的類必須有空構造器
<span style="font-size:14px;"><bean name="bean1" class="cn.javass.spring.chapter2.HelloImpl2"/></span>使用有參數構造器進行定義,使用此中方式,能夠使用< constructor-arg>標簽指定構造器參數值。當中index表示位置,value表示常量值,也能夠指定引用。指定引用使用ref來引用還有一個Bean定義。
<span style="font-size:14px;"><bean name="bean2" class="cn.javass.spring.chapter2.HelloImpl2"> <!-- 指定構造器參數 --> <constructor-arg index="0" value="Hello Spring!"/> </bean> </span>2、使用靜態工廠方式實例化Bean,使用這樣的方式除了指定必須的class屬性,還要指定factory-method屬性來指定實例化Bean的方法,並且使用靜態工廠方法也同意指定方法參數,spring IoC容器將調用此屬性指定的方法來獲取Bean,
3、使用實例工廠方法實例化Bean,使用這樣的方式不能指定class屬性。此時必須使用factory-bean屬性來指定工廠Bean。factory-method屬性指定實例化Bean的方法,並且使用實例工廠方法同意指定方法參數。方式和使用構造器方式一樣
【面試】【Spring常見問題總結】【06】