首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 綜合教學

Spring、Hibernate、Struts 面試筆試題精選:核心原理與實戰經驗深度解析

     編輯:Java 綜合教學

SSM 框架高頻面試題庫:從原理到最佳實踐的系統化梳理

整理自多輪面試實戰,覆蓋 Struts2、Hibernate、Spring 核心模塊,附帶標準答案要點與深度解析,適合面試前專項突擊。

一、Struts2 核心題

Q1: Action 是線程安全的嗎?如何保證?

答:不安全。Struts2 默認每個請求創建新 Action 實例 (prototype),但若配置為 singleton 或注入單例 Service 並持有狀態字段則不安全。
保證方案:
1) 僅在 Action 中定義局部變量;
2) Spring 管理 Action 時設置 scope="prototype";
3) 繼承 RequestProcessor 自定義創建邏輯。

Q2: Struts2 如何實現 MVC?

Model:JavaBean / POJO / EJB;
View:JSP + 標簽庫;
Controller:FilterDispatcher → ActionMapper → ActionProxy → ActionInvocation (攔截器鏈) → Action → Result。

Q3: 關鍵對象作用

  • Action:處理業務邏輯,返回 Result 字符串。
  • ActionForm (Struts1) / 域模型/字段驅動/模型驅動 (Struts2):數據封裝。
  • ActionMapping:封裝 struts.xml 中 <action> 配置信息。
  • ValueStack (值棧):Struts2 核心,存放 Action 實例、請求參數、上下文對象,OGNL 表達式根對象。

二、Hibernate 核心題

Q4: Hibernate 查詢方式有哪幾種?

HQL (面向對象)、SQL (原生)、Criteria API (程序化)、QBC (Query By Criteria)、Native SQL (命名查詢)。

Q5: load() vs get() 區別?

建議:確定存在用 load(),不確定用 get()。

Q6: 延遲加載與 OpenSessionInView 模式?

延遲加載要求 Session 開啟。OpenSessionInViewFilter 在 Web 層攔截請求,打開 Session 直到響應結束,保證視圖渲染階段仍可觸發延遲加載。注意:長事務風險、連接泄漏,需配合 @Transactional(readOnly=true) 優化。

三、Spring 核心題

Q7: AOP 與 IOC 概念及應用?

IOC (控制反轉/依賴注入):對象創建與依賴管理由容器接管,實現解耦。
AOP (面向切面):將橫切關注點 (事務、日誌、權限) 與業務邏輯分離。
應用:@Transactional 聲明式事務 (基於 AOP)、@Aspect 自定義切面。

Q8: Spring 事務傳播行為與隔離級別?

傳播行為 (7 種):
REQUIRED(默認,有事務加入,無則新建)、REQUIRES_NEW(掛起當前新建)、NESTED(嵌套保存點)、SUPPORTS/NOT_SUPPORTED/MANDATORY/NEVER。
隔離級別 (4+1):
READ_UNCOMMITTED(髒讀)、READ_COMMITTED(不可重複讀)、REPEATABLE_READ(幻讀、MySQL 默認)、SERIALIZABLE(串行化)、DEFAULT(用數據庫默認)。

Q9: update() vs saveOrUpdate()?

saveOrUpdate() 智能判斷:
1) 對象已在 Session 持久化 → 無操作;
2) 異 Session 關聯同 ID → 異常;
3) 無 ID/ID 為新對象 → save();
4) 有版本字段且版本為新 → save();
5) 否則 → update()。

Q10: Spring 整合 Hibernate 關鍵配置?

<bean id="sessionFactory" class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
  <property name="dataSource" ref="dataSource"/>
  <property name="packagesToScan" value="com.xxx.entity"/>
  <property name="hibernateProperties"> ... </property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate5.HibernateTransactionManager">
  <property name="sessionFactory" ref="sessionFactory"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

優勢:HibernateTemplate 簡化 API、統一異常轉換 (DataAccessException)、聲明式事務無侵入。

四、綜合實戰題

Q11: 如何解決 Struts2 中文亂碼?

配置 struts.properties:struts.i18n.encoding=UTF-8;或 Web.xml 配置 CharacterEncodingFilter (Spring 提供)。

Q12: 設計一個高併發下的扣減庫存方案 (Spring + MySQL)?

方案演進:
1) 數據庫行鎖 SELECT ... FOR UPDATE + 事務;
2) Redis Lua 腳本原子遞減 + 異步落庫;
3) 本地緩存 + 消息隊列削峰 + 最终一致性補償。
核心:@Transactional 邊界控制、樂觀鎖版本號防超賣、冪等 Token 防重複提交。

掌握以上題目核心考點,配合項目實戰經驗闡述,SSM 面試將游刃有餘。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
特性load()get()
返回代理對象 (延遲加載)真實對象 (立即查詢)
數據不存在拋 ObjectNotFoundException (訪問時)返回 null
緩存檢查只查一級緩存,無則建代理一級→二級→數據庫
性能未使用屬性時不查庫必查庫