引言
面試題==知識點,這里所記錄的面試題并不針對于面試者,而是將這些面試題作為技能知識點來看待,不以刷題進大廠為目的,而是以學習為目的,這里的知識點會持續更新,目錄也會隨時進行調整,
大家可以關注公眾號:編程火箭車,在【粉絲福利】中點擊【面題大全】,其中的Java面試題在線實時更新、查看,
一、面試題導航
點這里進入JavaWeb編程面試題——導航
面試題持續更新中......
二、面試題目
1.什么是Spring框架?Spring框架有哪些主要模塊?
Spring 是一種輕量級開發框架,旨在提高開發人員的開發效率以及系統的可維護性,
一般說 Spring 框架指的是 Spring Framework,它是很多模塊的集合,這些模塊是:核心容器、資料訪問/集成、Web、AOP(面向切面編程)、工具、訊息和測驗模塊,Spring 框架的主要目的是簡化 Java 后端開發作業,
2.Spring的優點?
-
Spring 屬于低侵入式設計,代碼的污染極低;
-
Spring 的 DI 機制將物件之間的依賴關系交由框架處理,降低組件的耦合度;
-
Spring 提供了 AOP 技術,支持將一些通用任務,如安全、事務、日志、權限等進行集中式管理,從而提供更好的復用;
-
Spring 對于主流的應用框架提供了集成支持,
3.列舉一些重要的Spring模塊?

一些重要的 Spring Framework 模塊:
-
Spring Core:基礎,可以說 Spring 其他所有的功能都需要依賴于該核心庫,主要提供 IOC 依賴注入功能,
-
Spring AOP:提供了面向切面的編程實作,
-
Spring Aspects:該模塊為與 AspectJ 的集成提供支持,
-
Spring JDBC:Java 資料庫連接,
-
Spring JMS:Java 訊息服務,
-
Spring ORM:用于支持 Mybatis、Hibernate 等 ORM 框架的支持,
-
Spring Web:為創建 Web 應用程式提供支持,
-
Spring Test:提供了對 JUnit 和 TestNG 測驗的支持,
4.談談對Spring IoC的理解?
IoC(Inverse of Control:控制反轉)是一種設計思想,就是將原本在程式中手動創建物件的控制權交由 Spring 框架來管理,IoC 在其他語言中也有應用,并非 Spring 特有,IoC 容器是 Spring 用來實作 IoC 的載體,IoC 容器實際上就是個 Map(key, value),Map 中存放的是各種物件,
將物件之間的相互依賴關系交給 IOC 容器來管理,并由 IOC 容器完成物件的注入,這樣可以很大程度上簡化應用的開發,把應用從復雜的依賴關系中解放出來,IOC 容器就像一個工廠一樣,當我們需要創建一個物件的時候,只需要配置好組態檔或注解即可,完全不用考慮物件是如何被創建出來的,
5.DI是什么?
IOC 的一個重點就是在程式運行時,動態的向某個物件提供它所需要的其他物件,這一點是通過 DI(Dependency Injection,依賴注入)來實作的,即應用程式在運行時依賴 IoC 容器來動態注入物件所需要的外部依賴,而 Spring 的 DI 具體就是通過反射實作注入的,反射允許程式在運行的時候動態的生成物件、執行物件的方法、改變物件的屬性,
6.IOC與DI有什么區別?
IOC 是解決耦合問題的一種設計思想,DI 是 IOC 的一種實作,IOC 主要的實作方式有兩種:依賴查找(DL),依賴注入(DI),
7.談談對Spring AOP的理解?
AOP(Aspect-Oriented Programming:面向切面編程)能夠將那些與業務無法,卻為業務模塊所共同呼叫的邏輯或責任(例如事務處理、日志管理、權限控制等)封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度,并有利于未來的可拓展性和可維護性,
Spring AOP 就是基于動態代理的,如果要代理的物件實作了某個介面,那么Spring AOP 會使用 JDK Proxy,去創建代理物件,而對于沒有實作介面的物件,就無法使用 JDK Proxy 去進行代理,這時候 Spring AOP 會使用 Cglib,這時候 Spring AOP 會使用 CGLIB 生成一個被代理物件的子類來作為代理,
使用 AOP 之后我們可以把一些通用的功能抽象出來,在需要用到的地方直接使用即可,這樣大大簡化了代碼量,我們需要增加新功能時也方便,提供了系統的擴展性,日志功能、事務管理等等場景都用到了 AOP,
8.靜態代理與動態代理有什么區別?
AOP 實作的關鍵在于 代理模式,AOP 代理主要分為靜態代理和動態代理,靜態代理的代表為 AspectJ;動態代理則以 Spring AOP 為代表,靜態代理與動態代理區別在于生成 AOP 代理物件的時機不同
(1)AspectJ 是靜態代理,也稱為編譯時增強,AOP 框架會在編譯階段生成 AOP 代理類,并將 AspectJ(切面)織入到 Java 位元組碼中,運行的時候就是增強之后的 AOP 物件,
(2)Spring AOP 使用的動態代理,所謂的動態代理就是說 AOP 框架不會去修改位元組碼,而是每次運行時在記憶體中臨時為方法生成一個 AOP 物件,這個 AOP 物件包含了目標物件的全部方法,并且在特定的切點做了增強處理,并回呼原物件的方法,
9.JDK動態代理和CGLIB動態代理的區別?
(1)JDK 動態代理只提供介面的代理,不支持類的代理,要求被代理類實作介面,JDK 動態代理的核心是 InvocationHandler 介面和 Proxy 類,在獲取代理物件時,使用 Proxy 類來動態創建目標類的代理類(即最終真正的代理類,這個類繼承自 Proxy 并實作了我們定義的介面),當代理物件呼叫真實物件的方法時, InvocationHandler 通過 invoke() 方法反射來呼叫目標類中的代碼,動態地將橫切邏輯和業務編織在一起;
(2)如果被代理類沒有實作介面,那么 Spring AOP 會選擇使用 CGLIB 來動態代理目標類,CGLIB(Code Generation Library),是一個代碼生成的類別庫,可以在運行時動態的生成指定類的一個子類物件,并覆寫其中特定方法并添加增強代碼,從而實作 AOP,CGLIB 是通過繼承的方式做的動態代理,因此如果某個類被標記為 final,那么它是無法使用 CGLIB 做動態代理的,
10.Spring支持幾種Bean的作用域?
當通過 Spring 容器創建一個 Bean 實體時,不僅可以完成 Bean 實體的實體化,還可以為 Bean 指定特定的作用域,
Spring 支持如下6種作用域:
-
singleton:單例模式,在整個 Spring IoC 容器中,使用 singleton 定義的 Bean 將只有一個實體,
-
prototype:原型模式,每次通過容器的 getBean 方法獲取 prototype 定義的 Bean 時,都將產生一個新的 Bean 實體,
-
request:對于每次 HTTP 請求,使用 request 定義的 Bean 都將產生一個新實體,即每次 HTTP 請求將會產生不同的 Bean 實體,只有在 Web 應用中使用 Spring 時,該作用域才有效,
-
session:對于每次 HTTP Session,使用 session 定義的 Bean 都將產生一個新實體,同樣只有在 Web 應用中使用 Spring 時,該作用域才有效,
-
application:整個應用活動期間,
-
websocket:一次埠通信,
其中比較常用的是 singleton 和 prototype 兩種作用域,對于 singleton 作用域的 Bean,每次請求該 Bean 都將獲得相同的實體,容器負責跟蹤 Bean 實體的狀態,負責維護 Bean 實體的生命周期行為;如果一個 Bean 被設定成 prototype 作用域,程式每次請求該 id 的 Bean,Spring 都會新建一個 Bean實體,然后回傳給程式,在這種情況下,Spring 容器僅僅使用 new 關鍵字創建 Bean 實體,一旦創建成功,容器不在跟蹤實體,也不會維護 Bean 實體的狀態,
如果不指定 Bean 的作用域,Spring 默認使用 singleton 作用域,Java 在創建 Java 實體時,需要進行記憶體申請;銷毀實體時,需要完成垃圾回收,這些作業都會導致系統開銷的增加,因此,prototype 作用域 Bean 的創建、銷毀代價比較大,而 singleton 作用域的 Bean 實體一旦創建成功,可以重復使用,因此,除非必要,否則盡量避免將 Bean 被設定成 prototype 作用域,
11.Spring常用的注入方式有哪些?
Spring 通過 DI(依賴注入)實作 IOC(控制反轉),常用的注入方式主要有三種:
-
構造方法注入
-
Setter 注入
-
基于注解的注入
12.Spring自動裝配Bean有哪些方式?
Spring 容器負責創建應用程式中的 Bean 同時通過 ID 來協調這些物件之間的關系,作為開發人員,我們需要告訴 Spring 要創建哪些 Bean 并且如何將其裝配到一起,
Spring 中 Bean 裝配有兩種方式:
-
隱式的 Bean 發現機制和自動裝配
-
在 Java 代碼或者 XML 中進行顯示配置
當然這些方式也可以配合使用,
13.Spring中的Bean是執行緒安全的嗎?
Spring 中的 Bean 默認是單例模式,Spring 容器本身并沒有提供執行緒安全的策略,因為是否執行緒安全完全取決于 Bean 本身的特性,但是具體情況還是要結合 Bean 的作用域來討論,
-
對于 prototype 作用域的 Bean,每次都創建一個新物件,也就是執行緒之間不存在 Bean 共享,因此不會有執行緒安全問題,
-
對于 singleton 作用域的 Bean,所有的執行緒都共享一個單例實體的 Bean,因此是存在執行緒安全問題的,但是如果單例 Bean 是一個無狀態 Bean,也就是執行緒中的操作不會對 Bean 的成員執行查詢以外的操作,那么這個單例 Bean 是執行緒安全的,比如 Controller 類、Service 類和 Dao 等,這些 Bean 大多是無狀態的,只關注于方法本身,
有狀態 Bean(Stateful Bean) :就是有實體變數的物件,可以保存資料,是非執行緒安全的,
無狀態 Bean(Stateless Bean):就是沒有實體變數的物件,不能保存資料,是不變類,是執行緒安全的,
14.Spring框架中用到了哪些設計模式?
關于下面一些設計模式的詳細介紹
-
工廠設計模式 : Spring 使用工廠模式通過 BeanFactory、ApplicationContext 創建 Bean 物件,
-
代理設計模式 : Spring AOP 功能的實作,
-
單例設計模式 : Spring 中的 Bean 默認都是單例的,
-
模板方法模式 : Spring 中 jdbcTemplate、hibernateTemplate 等以 Template 結尾的對資料庫操作的類,它們就使用到了模板模式,
-
包裝器設計模式 : 我們的專案需要連接多個資料庫,而且不同的客戶在每次訪問中根據需要會去訪問不同的資料庫,這種模式讓我們可以根據客戶的需求能夠動態切換不同的資料源,
-
觀察者模式: Spring 事件驅動模型就是觀察者模式很經典的一個應用,
-
配接器模式 :Spring AOP 的增強或通知(Advice)使用到了配接器模式、spring MVC 中也是用到了配接器模式適配 Controller,
15.@Component和@Bean的區別是什么?
(1)作用物件不同: @Component 注解作用于類,而 @Bean 注解作用于方法,
(2)@Component 通常是通過類路徑掃描來自動偵測以及自動裝配到 Spring 容器中(我們可以使用 @ComponentScan 注解定義要掃描的路徑從中找出標識了需要裝配的類自動裝配到 Spring 的 Bean 容器中),@Bean 注解通常是我們在標有該注解的方法中定義產生這個 Bean,@Bean 告訴了 Spring 這是某個類的示例,當我需要用它的時候還給我,
(3)@Bean 注解比 @Component 注解的自定義性更強,而且很多地方我們只能通過 @Bean 注解來注冊Bean,比如當我們參考第三方庫中的類需要裝配到 Spring 容器時,則只能通過 @Bean 來實作,
16.將一個類宣告為Spring的Bean的注解有哪些?
我們一般使用 @Autowired 注解自動裝配 Bean,要想把類標識成可用于 @Autowired 注解自動裝配的 Bean 的類,采用以下注解可實作:
-
@Component :通用的注解,可標注任意類為 Spring 組件,如果一個Bean不知道屬于拿個層,可以使用 @Component 注解標注,
-
@Repository : 對應持久層即 Dao 層,主要用于資料庫相關操作,
-
@Service : 對應服務層,主要涉及一些復雜的邏輯,需要用到 Dao 層,
-
@Controller : 對應 Spring MVC 控制層,主要用戶接受用戶請求并呼叫 Service 層回傳資料給前端頁面,
17.Spring事務實作方式有哪些?
編程式事務管理對基于 POJO 的應用來說是唯一選擇,我們需要在代碼中呼叫 beginTransaction()、commit()、rollback() 等事務管理相關的方法,這就是編程式事務管理,
-
基于 TransactionProxyFactoryBean 的宣告式事務管理,
-
基于 @Transactional 的宣告式事務管理,
-
基于 Aspectj AOP 配置事務,
18.Spring中一個介面有多個實作類如何不同注入我所需要的類?
-
@Autowired 是通過 byType 的方式去注入的,使用該注解,要求介面只能有一個實作類,
-
@Resource 可以通過 byName 和 byType 的方式注入,默認先按 byName 的方式進行匹配,如果匹配不到,再按 byType 的方式進行匹配,
-
@Qualifier 注解可以按名稱注入,但是注意是類名,
19.為什么要使用Spring?
(1)簡介
-
目的:解決企業應用開發的復雜性;
-
功能:使用基本的 JavaBean 代替 EJB,并提供了更多的企業應用功能;
-
范圍:任何 Java 應用;
-
簡單來說,Spring 是一個輕量級的控制反轉(IoC)和面向切面(AOP)的容器框架,
(2)輕量
從大小與開銷兩方面而言 Spring 都是輕量的,并且 Spring 所需的處理開銷也是微不足道的,此外,Spring 是非侵入式的:典型地,Spring 應用中的物件不依賴于 Spring 的特定類,
(3)控制反轉
Spring 通過一種稱作控制反轉(IoC)的技術促進了松耦合,當應用了 IoC,一個物件依賴的其它物件會通過被動的方式傳遞進來,而不是這個物件自己創建或者查找依賴物件,你可以認為 IoC 與 JNDI 相反——不是物件從容器中查找依賴,而是容器在物件初始化時不等物件請求就主動將依賴傳遞給它,
(4)面向切面
Spring 提供了面向切面編程的豐富支持,允許通過分離應用的業務邏輯與系統級服務(例如審計(auditing)和事務(transaction)管理)進行內聚性的開發,應用物件只實作它們應該做的——完成業務邏輯——僅此而已,它們并不負責(甚至是意識)其它的系統級關注點,例如日志或事務支持,
(5)容器
Spring 包含并管理應用物件的配置和生命周期,在這個意義上它是一種容器,你可以配置你的每個 Bean 如何被創建——基于一個可配置原型(prototype),你的 Bean 可以創建一個單獨的實體或者每次需要時都生成一個新的實體——以及它們是如何相互關聯的,然而,Spring 不應該被混同于傳統的重量級的 EJB 容器,它們經常是龐大與笨重的,難以使用,
(6)框架
Spring 可以將簡單的組件配置、組合成為復雜的應用,在 Spring 中,應用物件被宣告式地組合,典型地是在一個 XML 檔案里,Spring 也提供了很多基礎功能(事務管理、持久化框架集成等等),將應用邏輯的開發留給了你,
所有 Spring 的這些特征使你能夠撰寫更干凈、更可管理、并且更易于測驗的代碼,它們也為 Spring 中的各種模塊提供了基礎支持,
20.@Autowired和@Resource之間的區別?
-
@Autowired 默認是按照型別裝配注入的,默認情況下它要求依賴物件必須存在(可以設定它 required 屬性為 false),
-
@Resource 默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的 Bean 才會按照型別來裝配注入,
關注公眾號:編程火箭車
我們定期發布編程相關的文章、資訊、活動等內容,幫助編程愛好者、初學者或初級程式員快速入門、打牢基礎,歡迎大家關注,和我們一起探索編程的精彩世界,
本文來自博客園,作者:Ongoing蝸牛,轉載請注明原文鏈接:https://www.cnblogs.com/coding-rocket/p/17430075.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/553378.html
標籤:其他
上一篇:Netty實戰(三)
下一篇:返回列表
