java測試題(下)

1. Spring 核心概念

1.1 如何理解 Spring DI?

DI(依賴注入)IoC(控制反轉) 的具體實現方式,由 Spring 容器在運行時通過以下方式自動注入依賴:

  • 構造器注入(推薦)

  • Setter 注入

  • 字段注入(不推薦,因測試困難)

開發者無需手動 new 依賴對象,降低耦合度。


1.2 基于注解配置作用域與延遲加載

注解作用域示例描述
@Scope@Scope("singleton")(默認)單例模式,全局唯一實例
@Scope("prototype")每次請求創建新實例
@Scope(value="request")每個 HTTP 請求一個實例(Web 環境)
@Lazy@Lazy(true)延遲初始化,首次使用時創建 Bean

示例代碼

@Component
@Scope("prototype")
@Lazy
public class MyBean { }

1.3 BeanFactory vs ApplicationContext

特性BeanFactoryApplicationContext
加載時機懶加載(調用?getBean()?時)預加載(容器啟動時初始化所有單例 Bean)
高級功能支持國際化、事件傳播、AOP 等
適用場景資源受限環境(如移動設備)企業級應用(99% 場景使用)

1.4 Spring Bean 生命周期

  1. 實例化:通過反射創建 Bean 實例。

  2. 屬性賦值:DI 注入依賴。

  3. 初始化

    • 調用 @PostConstruct 方法

    • 實現 InitializingBeanafterPropertiesSet()

  4. 使用:容器中的 Bean 被調用。

  5. 銷毀

    • 調用 @PreDestroy 方法

    • 實現 DisposableBeandestroy()


1.5 Bean 作用域對比

作用域描述適用場景
singleton默認作用域,容器內唯一實例無狀態服務(如工具類、DAO)
prototype每次請求創建新實例有狀態對象(如用戶會話)
request每個 HTTP 請求一個實例(Web 環境)表單數據、請求級緩存
session每個 HTTP Session 一個實例用戶登錄狀態、購物車
application整個 Web 應用共享一個實例(ServletContext)全局配置、緩存

1.6 設計模式應用

模式示例
工廠模式BeanFactory?創建 Bean 實例
單例模式默認作用域?singleton
代理模式AOP 動態代理(JDK/CGLIB)
觀察者模式事件監聽(ApplicationListener
模板方法模式JdbcTemplateRestTemplate

1.7 Controller 并發安全

  • 無狀態設計:避免定義成員變量。

  • 線程安全:所有數據通過方法參數或局部變量傳遞。

  • 示例

    @RestController
    public class SafeController {// 正確:無成員變量@GetMapping("/test")public String test(@RequestParam String param) {return "Result: " + param;}
    }

2. Spring MVC

2.1 處理流程

  1. DispatcherServlet 接收請求。

  2. HandlerMapping 根據 @RequestMapping 匹配 Controller。

  3. HandlerAdapter 調用 Controller 方法。

  4. Controller 返回 ModelAndView 或 JSON(@ResponseBody)。

  5. ViewResolver 解析視圖(如 JSP、Thymeleaf)。

  6. 渲染視圖 并返回響應。


2.2 與 AJAX 交互

  • 后端:使用 @RestController + @ResponseBody 返回 JSON。

  • 前端:AJAX 請求示例(jQuery)

    $.get("/api/user/1", function(data) {console.log(data.name);
    });

2.3 與 Struts2 對比

特性Spring MVCStruts2
控制器單例(線程安全)多例(每個請求一個 Action)
配置注解驅動(零 XML)基于 XML 和 OGNL
性能更高(無攔截器棧)較低(復雜 OGNL 解析)
生態與 Spring Boot 無縫集成社區已停滯

3. Spring 事務管理

3.1 兩種方式對比

方式優點缺點
聲明式零侵入(@Transactional學習 AOP 和配置復雜
編程式精確控制(TransactionTemplate代碼冗余、維護困難

3.2 優勢

  • 傳播行為:支持 REQUIREDREQUIRES_NEW 等 7 種策略。

  • 隔離級別READ_COMMITTEDSERIALIZABLE 等。

  • 多技術兼容:統一 JDBC、JPA、Hibernate 事務。

  • 測試支持:測試時自動回滾(@Rollback)。


4. MyBatis

4.1 動態 SQL 解決的問題

  • SQL 注入#{} 預編譯參數(如 #{id})。

  • 代碼冗余<if><choose> 等標簽動態拼接 SQL。

  • 復雜查詢<foreach> 處理 IN 語句。

示例

<select id="findUser" resultType="User">SELECT * FROM user<where><if test="name != null">AND name = #{name}</if></where>
</select>

4.2 緩存機制

類型范圍生命周期配置方式
一級緩存SqlSession同一會話內有效,默認開啟無需配置
二級緩存Mapper跨 SqlSession,需手動開啟<cache/>?或注解?@CacheNamespace

4.3 接口綁定

  • 原理:通過 JDK 動態代理為 Mapper 接口生成實現類。

  • 好處

    • SQL 與 Java 代碼分離(XML 或注解)。

    • 無需手動實現 DAO(如 JDBC 模板)。

    • 支持動態 SQL 和結果映射。


4.4 JDBC 不足與 MyBatis 解決

JDBC 問題MyBatis 解決方案
冗余代碼封裝模板(SqlSessionTemplate
手動事務管理集成 Spring 聲明式事務
無連接池集成 HikariCP、Druid
手動 ORM自動結果映射(@Results

4.5 優缺點

優點缺點
SQL 可控性強需手寫 SQL
輕量級(無過度封裝)二級緩存配置復雜
性能優化友好(如延遲加載)XML 配置繁瑣(可用注解)

5. Shiro 權限管理

5.1 認證與授權流程

  1. 認證

    • Subject.login() 提交憑證(如用戶名/密碼)。

    • Realm.doGetAuthenticationInfo() 驗證身份。

    • 成功后將用戶信息存入 Session

  2. 授權

    • Realm.doGetAuthorizationInfo() 加載角色和權限。

    • 通過注解 @RequiresRoles("admin") 或標簽 <shiro:hasPermission> 校驗權限。


6. 其他常見問題

6.1 Bean 工廠底層機制

  • 反射:通過 Class.forName() 實例化 Bean。

  • 工廠模式BeanFactory 管理對象生命周期。

  • 動態代理:AOP 生成代理對象(JDK/CGLIB)。

  • 資源釋放:調用 DisposableBean.destroy()@PreDestroy 避免內存泄漏。


6.2 內存泄漏

  • 定義:已分配內存無法被 GC 回收(如未關閉的 ConnectionThreadLocal 未清理)。

  • 預防:使用 try-with-resources、Spring 的 DisposableBean

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/916457.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/916457.shtml
英文地址,請注明出處:http://en.pswp.cn/news/916457.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

LC振蕩Multisim仿真

電路圖&#xff1a;說明&#xff1a;點擊仿真后&#xff0c;先打開S1&#xff0c;可以看到C1的充電曲線。當電容充滿電后&#xff0c;關閉S1&#xff0c;打開S2&#xff0c;這時候&#xff0c;C2電容會快速獲得C1一半的電量。如果沒有L&#xff0c;曲線會變得很陡。如果只加入電…

五、Web開發

文章目錄1. SpringMVC自動配置概覽2. 簡單功能分析2.1 靜態資源訪問2.1.1 靜態資源目錄2.1.2 靜態資源訪問前綴2.1.3 webjar2.2 歡迎頁支持2.3 自定義 Favicon2.4 靜態資源配置原理2.4.1 配置類只有一個有參構造器2.4.2 資源處理的默認規則2.4.3 歡迎頁的處理規則2.4.4 favicon…

Mysql 二進制安裝常見問題

1. mysql: error while loading shared libraries: libncurses.so.5: cannot open shared object file: No such file or directory在centos9中升級了libncurses.so的版本為libncurses.so.6&#xff0c;所以找不到libncurses.so.5需要使用軟連接指向libncurses.so.6ln -s /lib6…

OpenLayers 綜合案例-點位聚合

看過的知識不等于學會。唯有用心總結、系統記錄&#xff0c;并通過溫故知新反復實踐&#xff0c;才能真正掌握一二 作為一名摸爬滾打三年的前端開發&#xff0c;開源社區給了我飯碗&#xff0c;我也將所學的知識體系回饋給大家&#xff0c;助你少走彎路&#xff01; OpenLayers…

測試老鳥整理,物流項目系統測試+測試點分析(一)

目錄&#xff1a;導讀 前言一、Python編程入門到精通二、接口自動化項目實戰三、Web自動化項目實戰四、App自動化項目實戰五、一線大廠簡歷六、測試開發DevOps體系七、常用自動化測試工具八、JMeter性能測試九、總結&#xff08;尾部小驚喜&#xff09; 前言 物流項目&#xf…

好的編程語言設計是用簡潔清晰的原語組合復雜功能

首先&#xff0c;函數命名要user friendly&#xff0c;比如最常用的控制臺輸入輸出&#xff0c;input scanf gets read readln readline print println writeline… 我專門詢問了chatgpt&#xff0c;讓它給出流行度百分比最高的組合&#xff08;ai干這個最在行&#xff09;&…

基于springboot的在線購票系統/在線售票系統

用戶&#xff1a;注冊&#xff0c;登錄&#xff0c;影院信息&#xff0c;即將上映&#xff0c;電影信息&#xff0c;新聞公告&#xff0c;取票管理&#xff0c;電影評價管理&#xff0c;我的收藏管理&#xff0c;個人中心管理員&#xff1a;登錄&#xff0c;個人中心&#xff0…

Spring Boot項目打包部署常見問題解決方案

問題一&#xff1a;JAR包缺少主清單屬性 問題描述 在使用 java -jar 命令啟動Spring Boot項目時&#xff0c;遇到以下錯誤&#xff1a; demo-service.jar中沒有主清單屬性問題原因 pom.xml 中 spring-boot-maven-plugin 配置不正確打包時跳過了主清單文件的生成主類&#xff08…

【分享】外國使館雷電綜合防護系統改造方案(一)

1防雷項目設計思想&#xff1a;1.1設計依據&#xff1a;依據中國GB標準與部委頒發的設計規范的要求&#xff0c;該建筑物和大樓內之計算機房等設備都必須有完整完善之防護措施&#xff0c;保證該系統能正常運作。這包括電源供電系統、不間斷供電系統&#xff0c;空調設備、電腦…

數據結構預備知識

在學習數據結構之前&#xff0c;有些知識是很有必要提前知道的&#xff0c;它們包括&#xff1a;集合框架、復雜度和泛型。本篇文章專門介紹這三個東西。1.集合框架1.1 什么是集合框架Java 集合框架(Java Collection Framework)&#xff0c;又被稱為容器&#xff0c;是定義在 j…

【C++】數字cmath庫常用函數

菜鳥傳送門&#xff1a;https://www.runoob.com/cplusplus/cpp-numbers.html 作者廢話&#xff1a;作為一個從業3年的JS人&#xff0c;現在重拾C&#xff0c;雖然眾多語言都有很多相似之處&#xff08;至少算法&#xff0c;數學運算&#xff0c;數據結構等等那些都是相同的&…

神經網絡(第二課第一周)

文章目錄神經網絡&#xff08;第二課第一周&#xff09;&#xff08;一&#xff09;神經網絡的內涵&#xff08;二&#xff09;如何構建神經元層1、tensorflow如何處理數據&#xff08;Tensorflow 是由 Google 開發的機器學習包。&#xff09;2、詳細的一些實驗代碼&#xff0c…

CCF-GESP 等級考試 2025年6月認證C++七級真題解析

1 單選題&#xff08;每題 2 分&#xff0c;共 30 分&#xff09;第1題 已知小寫字母 b 的ASCII碼為98&#xff0c;下列C代碼的輸出結果是&#xff08; &#xff09;。#include <iostream>using namespace std;int main() { char a b ^ 4; cout << a; …

【HarmonyOS】鴻蒙應用開發中常用的三方庫介紹和使用示例

【HarmonyOS】鴻蒙應用開發中常用的三方庫介紹和使用示例 截止到2025年&#xff0c;目前參考官方文檔&#xff1a;訪問 HarmonyOS三方庫中心 。梳理了以下熱門下載量和常用的三方庫。 上述庫的組合&#xff0c;可快速實現網絡請求、UI搭建、狀態管理等核心功能&#xff0c;顯著…

SpringBoot 獲取請求參數的常用注解

SpringBoot 提供了多種注解來方便地從 HTTP 請求中獲取參數以下是主要的注解及其用法&#xff1a;1. RequestParam用于獲取查詢參數(URL 參數)&#xff0c;適用于 GET 請求或 POST 表單提交。GetMapping("/user") public String getUser(RequestParam("id"…

【Linux篇章】Socket 套接字,竟讓 UDP 網絡通信如此絲滑,成為一招致勝的秘籍!

本篇文章將帶大家了解網絡通信是如何進行的&#xff08;如包括網絡字節序&#xff0c;端口號&#xff0c;協議等&#xff09; &#xff1b;再對socket套接字進行介紹&#xff1b;以及一些udp-socket相關網絡通信接口的介紹及使用&#xff1b;最后進行對基于udp的網絡通信&#…

GIF圖像格式

你可能已經知道&#xff0c;GIF 是一種光柵圖像文件格式&#xff0c;它在不損失圖像質量的前提下提供壓縮功能&#xff0c;并且支持動畫和透明度。 GIF 是“Graphics Interchange Format&#xff08;圖形交換格式&#xff09;”的縮寫。由于其良好的兼容性以及在不同應用程序和…

D3.js的力導向圖使用入門筆記

D3.js是一個用于數據可視化的JavaScript庫,廣泛應用于Web端的數據交互式圖形展示 中文文檔&#xff1a;入門 | D3 中文網 一、D3.js核心特點 1、核心思想 將數據綁定到DOM元素&#xff0c;通過數據動態生成/修改可視化圖形。 2、應用場景 交互式圖表&#xff1a;如動態條…

Zookeeper的分布式事務與原子性:深入解析與實踐指南

引言在分布式系統架構中&#xff0c;事務管理和原子性保證一直是極具挑戰性的核心問題。作為分布式協調服務的標桿&#xff0c;Apache Zookeeper提供了一套獨特而強大的機制來處理分布式環境下的原子操作。本文將深入探討Zookeeper如何實現分布式事務的原子性保證&#xff0c;分…

Lua(迭代器)

Lua 迭代器基礎概念Lua 迭代器是一種允許遍歷集合&#xff08;如數組、表&#xff09;元素的機制。迭代器通常由兩個部分組成&#xff1a;迭代函數和狀態控制變量。每次調用迭代函數會返回集合中的下一個元素。泛型 for 循環Lua 提供了泛型 for 循環來簡化迭代器的使用。語法如…