java最新面試題之Spring框架部分
1、SpringMVC的工作原理?
使用者向伺服器發送請求,請求被springMVC前端控制器DispatchServlet捕獲;
DispatcherServle對請求URL進行解析,得到請求資源識別碼(URL),然後根據該URL呼叫HandlerMapping將請求映射到處理器HandlerExcutionChain;
DispatchServlet根據獲得Handler選擇一個合適的HandlerAdapter適配器處理;
Handler對資料處理完成以後將返回一個ModelAndView物件給DisPatchServlet;
Handler傳回的ModelAndView只是一個邏輯視圖並不是一個正式的視圖,DispatcherSevlet透過ViewResolver試圖解析器將邏輯視圖轉換為真正的視圖View;
DispatcherServle透過model解析出ModelAndView()中的參數進行解析最終展現出完整的view並回傳給客戶端;
#2、SpringMVC常用註解都有哪些?
@RequestMapping用於請求url映射。
@RequestBody註解實作接收http請求的json數據,將json資料轉換為java物件。
@ResponseBody註解實作將controller方法回傳物件轉換為json回應給客戶。
3、如何開啟註解處理器和適配器?
我們在專案中一般會在springmvc.xml中透過開啟 來實現註解處理器和適配器的開啟。
4、如何解決get、post亂碼問題?
解決post請求亂碼:我們可以在web.xml裡邊設定一個CharacterEncodingFilter過濾器。設定為utf-8.解決get請求的亂碼:有兩種方法。對於get請求中文參數出現亂碼解決方法有兩個:
修改tomcat設定檔新增編碼與工程編碼一致。
另外一種方法將參數重新編碼String userName = new String(request.getParameter(“userName”).getBytes(“ISO8859-1”),“utf-8”);
5、談談你對Spring的理解?
Spring是一個開源框架,為簡化企業級應用開發而生。 Spring可以是使簡單的JavaBean實作以前只有EJB才能實現的功能。 Spring是一個IOC和AOP容器框架。
Spring容器的主要核心是:
控制反轉(IOC),傳統的java開發模式中,當需要一個物件時,我們會自己使用new或者getInstance等直接或間接呼叫建構方法來建立一個物件。而在spring開發模式中,spring容器使用了工廠模式為我們創建了所需的對象,不需要我們自己創建了,直接呼叫spring提供的對象就可以了,這是控制反轉的想法。
依賴注入(DI),spring使用JavaBean物件的set方法或帶有參數的建構方法為我們在創建所需物件時將其屬性自動設定所需的值的過程,就是依賴注入的思想。
面向切面程式設計(AOP),在物件導向程式設計(oop)想法中,我們將事物縱向抽成一個個的物件。而在面向切面程式設計中,我們將一個個的物件某些類似的面向橫向抽成一個切面,對這個切面進行一些如權限控制、事物管理,記錄日誌等公用操作處理的過程就是面向切面程式設計的思想。 AOP底層是動態代理,如果是介面採用JDK動態代理,如果是類別採用CGLIB方式實作動態代理
6、Spring中的設計模式有哪些?
單例模式-spring中兩種代理方式,若目標物件實作了若干接口,spring使用jdk的java.lang.reflect.Proxy類別代理程式。若目標兌現沒有實現任何接口,spring使用CGLIB庫生成目標類的子類。單例模式-在spring的設定檔中設定bean預設為單例模式。
模板方式模式-用來解決程式碼重複的問題。例如:RestTemplate、JmsTemplate、JpaTemplate
前端控制器模式-spring提供了前端控制器DispatherServlet來分發請求。
試圖幫助(viewhelper)-spring提供了一系列的JSP標籤,高效巨集來幫助將分散的程式碼整合在試圖中。
依賴注入-貫穿BeanFactory/ApplacationContext介面的核心理念。
工廠模式-在工廠模式中,我們在建立物件時不會對客戶端暴露建立邏輯,並且是透過使用同一個介面來指向新建立的物件。 Spring中使用beanFactory來建立物件的實例。
7、Spring的常用註解?
Spring在2.5版本以後開始支援註解的方式來配置依賴注入。可以用註解的方式來取代xml中bean的描述。註解注入將會被容器在XML注入之前被處理,所以後者會覆寫前者對於同一個屬性的處理結果。
註解裝配在spring中預設是關閉的。所以需要在spring的核心設定檔中配置一下才能使用基於註解的組裝模式。配置方式如下:
常用的註解:
@Required:此註解應用於設值方法。
@Autowired:此註解應用於有值設值方法、非設值方法、建構方法和變數。
@Qualifier:此註解和@Autowired搭配使用,用於消除特定bean自動組裝的歧義。
8、簡單介紹一下spring bean的生命週期?
#bean定義:在設定檔裡面用 來定義。
bean初始化:有兩種方式初始化: 在設定檔中透過指定init-method屬性來完成。實作org.springframwork.beans.factory.InitializingBean介面。
bean呼叫:有三種方式可以得到bean實例,並進行呼叫
bean銷毀:銷毀有兩種方式: 使用設定檔指定的destroy-method屬性。實作org.springframwork.bean.factory.DisposeableBean。
9、Spring結構圖了解嗎?
核心容器:包括Core、Beans、Context、EL模組。 Core模組:封裝了框架依賴的最底層部分,包括資源存取、類型轉換及一些常用工具類別。
Beans模組:提供了框架的基礎部分,包括反轉控制和依賴注入。其中BeanFactory是容器核心,本質是“工廠設計模式”的實現,而且無需編程實現“單例設計模式”,單例完全由容器控制,而且提倡面向接口編程,而非面向實現編程;所有應用程序對象及物件間關係由框架管理,從而真正把你從程式邏輯中把維護物件之間的依賴關係提取出來,所有這些依賴關係都由BeanFactory來維護。
Context模組:以Core和Beans為基礎,整合Beans模組功能並新增資源綁定、資料驗證、國際化、JavaEE支援、容器生命週期、事件傳播等;核心介面是ApplicationContext。
EL模組:提供強大的表達式語言支持,支援存取和修改屬性值,方法調用,支援存取及修改數組、容器和索引器,命名變數,支援算數和邏輯運算,支援從Spring容器取得Bean,它也支援清單投影、選擇和一般的清單聚合等。
AOP、Aspects模組: AOP模組:SpringAOP模組提供了符合AOPAlliance規範的面向方面的程式設計(aspect-orientedprogramming)實現,提供例如日誌記錄、權限控制、效能統計等通用功能和業務邏輯分離的技術,並且能動態的把這些功能添加到需要的程式碼中;這樣各專其職,降低業務邏輯和通用功能的耦合。
Aspects模組:提供了對AspectJ的集成,AspectJ提供了比SpringASP更強大的功能。資料存取/整合模組:此模組包括了JDBC、ORM、OXM、JMS和事務管理。
事務模組:此模組用於Spring管理事務,只要是Spring管理物件都能得到Spring管理事務的好處,無需在程式碼中進行事務控制了,而且支援程式設計和聲明性的事務管理。
JDBC模組:提供了一個JBDC的範例模板,使用這些模板能消除傳統冗長的JDBC編碼還有必須的事務控制,而且能享受Spring管理事務的好處。
ORM模組:提供與流行的「物件-關係」映射框架的無縫集成,包括Hibernate、JPA、MyBatis等。而且可以使用Spring事務管理,無需額外控制事務。
OXM模組:提供了一個對Object/XML映射實現,將java對象映射成XML數據,或者將XML數據映射成java對象,Object/XML映射實現包括JAXB、Castor、XMLBeans和XStream。
JMS模組:用於JMS(JavaMessagingService),提供一套「訊息生產者、訊息消費者」範本用於更簡單的使用JMS,JMS用於用於在兩個應用程式之間,或分散式系統中傳送訊息,進行非同步通訊。 Web/Remoting模組:Web/Remoting模組包含了Web、Web-Servlet、Web-Struts、Web-Porlet模組。
Web模組:提供了基礎的web功能。例如多檔案上傳、整合IoC容器、遠端過程存取(RMI、Hessian、Burlap)以及WebService支持,並提供一個RestTemplate類別來提供方便的Restfulservices存取。
Web-Servlet模組:提供了一個SpringMVCWeb框架實作。 SpringMVC框架提供了基於註解的請求資源注入、更簡單的資料綁定、資料驗證等及一套非常易用的JSP標籤,完全無縫與Spring其他技術協作。
Web-Struts模組:提供了與Struts無縫集成,Struts1.x和Struts2.x都支援Test模組:Spring支援Junit和TestNG測試框架,而且還額外提供了一些基於Spring的測試功能,例如在測試Web框架時,模擬Http請求的功能。
10、Spring能幫我們做什麼?
Spring能幫我們根據設定檔建立及組裝物件之間的依賴關係。
Spring根據設定檔來進行建立及組裝物件間依賴關係,只需要改設定檔即可
Spring面向切面程式設計能幫助我們無耦合的實作日誌記錄,性能統計,安全控制。
Spring面向切面程式設計能提供一種更好的方式來完成,一般透過配置方式,而且不需要在現有程式碼中添加任何額外程式碼,現有程式碼專注業務邏輯。
Spring能非常簡單的幫我們管理資料庫事務。
採用Spring,我們只需取得連接,執行SQL,其他事物相關的都交給Spring來管理了。
Spring還能與第三方資料庫存取框架(如Hibernate、JPA)無縫集成,而且自己也提供了一套JDBC存取模板,來方便資料庫存取。
Spring還能與第三方Web(如Struts、JSF)框架無縫集成,而且自己也提供了一套SpringMVC框架,來方便web層搭建。
Spring能方便的與JavaEE(如JavaMail、任務排程)整合,與更多技術整合(如快取框架)。
11、請描述Spring的事務?
宣告式交易管理的定義:用在Spring設定檔中宣告式的處理交易來取代程式碼式的處理交易。這樣的好處是,事務管理不侵入開發的元件,具體來說,業務邏輯物件就不會意識到正在事務管理之中,事實上也應該如此,因為事務管理是屬於系統層面的服務,而不是業務邏輯的一部分,如果想要改變事務管理規劃的話,也只需要在定義檔中重新配置即可,這樣維護起來極為方便。
基於TransactionInterceptor的聲明式事務管理:兩個次要的屬性:transactionManager,用來指定一個事務治理器,並將具體事務相關的操作請託給它;其他一個是Properties類型的transactionAttributes屬性,在該屬性的每一個鍵值對中,鍵指定的是方法名,方法名可以行使通配符,而值就是表現呼應方法的所運用的事務屬性。
<beans> ...... <bean id="transactionInterceptor" class="org.springframework.transaction.interceptor.TransactionInterceptor"> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="transfer">PROPAGATION_REQUIRED</prop> </props> </property> </bean> <bean id="bankServiceTarget" class="footmark.spring.core.tx.declare.origin.BankServiceImpl"> <property name="bankDao" ref="bankDao"/> </bean> <bean id="bankService" class="org.springframework.aop.framework.ProxyFactoryBean"> <property name="target" ref="bankServiceTarget"/> <property name="interceptorNames"> <list> <idref bean="transactionInterceptor"/> </list> </property> </bean> </beans>
基於 TransactionProxyFactoryBean 的宣告式交易管理:設定設定檔與先前比照簡化了許多。我們把這類設定設定檔格式稱為 Spring 經典的宣告式事務治理。
<beans> ...... <bean id="bankServiceTarget" class="footmark.spring.core.tx.declare.classic.BankServiceImpl"> <property name="bankDao" ref="bankDao"/> </bean> <bean id="bankService" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> <property name="target" ref="bankServiceTarget"/> <property name="transactionManager" ref="transactionManager"/> <property name="transactionAttributes"> <props> <prop key="transfer">PROPAGATION_REQUIRED</prop> </props> </property> </bean> </beans>
基於命名空間的宣告式事務治理:在前兩種方法的基礎上,Spring 2.x 引入了命名空間, 連結行使命名空間,帶給開發人員設定配備聲明式事務的全新體驗。
<beans> ...... <bean id="bankService" class="footmark.spring.core.tx.declare.namespace.BankServiceImpl"> <property name="bankDao" ref="bankDao"/> </bean> <tx:advice id="bankAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="transfer" propagation="REQUIRED"/> </tx:attributes> </tx:advice> <aop:config> <aop:pointcut id="bankPointcut" expression="execution(* *.transfer(..))"/> <aop:advisor advice-ref="bankAdvice" pointcut-ref="bankPointcut"/> </aop:config> ...... </beans>
基於 @Transactional 的聲明式事務管理:Spring 2.x 也引入了基於 Annotation 的體式格式,具體次要觸及@Transactional 標註。 @Transactional 可以浸染於介面、介面方法、類別和類別方法上。當算用於類別上時,該類別的一切public 方法將都具有該類型的事務屬性。
@Transactional(propagation = Propagation.REQUIRED) public boolean transfer(Long fromId, Long toId, double amount) { return bankDao.transfer(fromId, toId, amount); }
編程式事務管理的定義:在程式碼中明確挪用 beginTransaction()、commit()、rollback()等事務治理相關的方法, 這就是編程序事務管理。 Spring 對事物的編程序管理有基於底層 API 的編程序管理和基於 TransactionTemplate 的編程序事務管理兩種方式。
基 於 底 層 API 的 編 程 式 管 理 : 憑 證 PlatformTransactionManager 、 TransactionDefinition 和TransactionStatus 三個焦點接口,來實現編程序事務管理。
public class BankServiceImpl implements BankService { private BanckDao bankDao; private TransactionDefinition txDefinition; private PlatformTransactionManager txManager; public boolean transfer(Long fromId, Long toId, double amount) { TransactionStatus txStatus = txManager.getTransaction(txDefinition); boolean result = false; try { result = bankDao.transfer(fromId, toId, amount); txManager.commit(txStatus); } catch (Exception e) { result = false; txManager.rollback(txStatus); System.out.println("Transfer Error!"); } return result; } }
基於TransactionTemplate 的編程式事務管理:為了不損壞程式碼原有的條理性,避免出現每一個方法中都包含相同的啟動事物、提交、回滾事物樣板程式碼的現象,spring 提供了transactionTemplate 模板來實作編程序事務管理。
public class BankServiceImpl implements BankService { private BankDao bankDao; private TransactionTemplate transactionTemplate; public boolean transfer(final Long fromId, final Long toId, final double amount) { return (Boolean) transactionTemplate.execute(new TransactionCallback() { public Object doInTransaction(TransactionStatus status) { Object result; try { result = bankDao.transfer(fromId, toId, amount); } catch (Exception e) { status.setRollbackOnly(); result = false; System.out.println("Transfer Error!"); } return result; } }); } }
編程式事務與宣告式交易的區別:
編程式事務是自己寫事務處理的類,然後呼叫。
宣告式交易是在設定檔中配置,一般搭配在框架裡面使用。
以上是java最新面試題之Spring框架部分的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

Java 8引入了Stream API,提供了一種強大且表達力豐富的處理數據集合的方式。然而,使用Stream時,一個常見問題是:如何從forEach操作中中斷或返回? 傳統循環允許提前中斷或返回,但Stream的forEach方法並不直接支持這種方式。本文將解釋原因,並探討在Stream處理系統中實現提前終止的替代方法。 延伸閱讀: Java Stream API改進 理解Stream forEach forEach方法是一個終端操作,它對Stream中的每個元素執行一個操作。它的設計意圖是處

PHP是一種廣泛應用於服務器端的腳本語言,特別適合web開發。 1.PHP可以嵌入HTML,處理HTTP請求和響應,支持多種數據庫。 2.PHP用於生成動態網頁內容,處理表單數據,訪問數據庫等,具有強大的社區支持和開源資源。 3.PHP是解釋型語言,執行過程包括詞法分析、語法分析、編譯和執行。 4.PHP可以與MySQL結合用於用戶註冊系統等高級應用。 5.調試PHP時,可使用error_reporting()和var_dump()等函數。 6.優化PHP代碼可通過緩存機制、優化數據庫查詢和使用內置函數。 7

PHP和Python各有優勢,選擇應基於項目需求。 1.PHP適合web開發,語法簡單,執行效率高。 2.Python適用於數據科學和機器學習,語法簡潔,庫豐富。

PHP適合web開發,特別是在快速開發和處理動態內容方面表現出色,但不擅長數據科學和企業級應用。與Python相比,PHP在web開發中更具優勢,但在數據科學領域不如Python;與Java相比,PHP在企業級應用中表現較差,但在web開發中更靈活;與JavaScript相比,PHP在後端開發中更簡潔,但在前端開發中不如JavaScript。

膠囊是一種三維幾何圖形,由一個圓柱體和兩端各一個半球體組成。膠囊的體積可以通過將圓柱體的體積和兩端半球體的體積相加來計算。本教程將討論如何使用不同的方法在Java中計算給定膠囊的體積。 膠囊體積公式 膠囊體積的公式如下: 膠囊體積 = 圓柱體體積 兩個半球體體積 其中, r: 半球體的半徑。 h: 圓柱體的高度(不包括半球體)。 例子 1 輸入 半徑 = 5 單位 高度 = 10 單位 輸出 體積 = 1570.8 立方單位 解釋 使用公式計算體積: 體積 = π × r2 × h (4

PHP和Python各有優勢,適合不同場景。 1.PHP適用於web開發,提供內置web服務器和豐富函數庫。 2.Python適合數據科學和機器學習,語法簡潔且有強大標準庫。選擇時應根據項目需求決定。

Java是熱門程式語言,適合初學者和經驗豐富的開發者學習。本教學從基礎概念出發,逐步深入解說進階主題。安裝Java開發工具包後,可透過建立簡單的「Hello,World!」程式來實踐程式設計。理解程式碼後,使用命令提示字元編譯並執行程序,控制台上將輸出「Hello,World!」。學習Java開啟了程式設計之旅,隨著掌握程度加深,可創建更複雜的應用程式。

PHP成為許多網站首選技術棧的原因包括其易用性、強大社區支持和廣泛應用。 1)易於學習和使用,適合初學者。 2)擁有龐大的開發者社區,資源豐富。 3)廣泛應用於WordPress、Drupal等平台。 4)與Web服務器緊密集成,簡化開發部署。
