javascript
2022最新Spring相关大厂常问技术面试题大全 —— 金三银四好时机
Spring相關大廠常問面試題
- 1. 什么是 Spring 框架?
- 2. 列舉一些重要的Spring模塊?
- 3. @RestController 與 @Controller 的區別
- 4. 談談自己對于 Spring IoC 和 AOP 的理解
- 5. Spring 中的 bean 的作用域有哪些?
- 6. Spring 中的單例 bean 的線程安全問題了解嗎
- 7. @Component 和 @Bean 的區別是什么?
- 8. 將一個類聲明為Spring的 bean 的注解有哪些?
- 9. Spring 中的 bean 生命周期?
1. 什么是 Spring 框架?
Spring 是一種輕量級開發框架,旨在提高開發人員的開發效率以及系統的可維護性。
我們一般說 Spring 框架指的都是 Spring Framework,它是很多模塊的集合,使用這些模塊可以很方便地協助我們進行開發。這些模塊是:核心容器、數據訪問/集成,、Web、AOP(面向切面編程)、工具、消息和測試模塊。比如:Core Container 中的 Core 組件是Spring 所有組件的核心,Beans 組件和 Context 組件是實現IOC和依賴注入的基礎,AOP組件用來實現面向切面編程。
2. 列舉一些重要的Spring模塊?
Spring Core: 基礎,可以說 Spring 其他所有的功能都需要依賴于該類庫。主要提供 IoC 依賴注入功能。
Spring Aspects : 該模塊為與AspectJ的集成提供支持。
Spring AOP :提供了面向切面的編程實現。
Spring JDBC : Java數據庫連接。
Spring JMS :Java消息服務。
Spring ORM : 用于支持Hibernate等ORM工具。
Spring Web : 為創建Web應用程序提供支持。
Spring Test : 提供了對 JUnit 和 TestNG 測試的支持。
3. @RestController 與 @Controller 的區別
- @Controller 返回一個頁面
單獨使用 @Controller 不加 @ResponseBody 的話一般使用在要返回一個視圖的情況,這種情況屬于比較傳統的Spring MVC 的應用,對應于前后端不分離的情況。 - @RestController 返回JSON 或 XML 形式數據但
@RestController 只返回對象,對象數據直接以 JSON 或 XML 形式寫入 HTTP 響應(Response)中,這種情況屬于 RESTful Web服務,這也是目前日常開發所接觸的最常用的情況(前后端分離)。
4. 談談自己對于 Spring IoC 和 AOP 的理解
IoC(Inverse of Control:控制反轉)是一種設計思想,就是 將原本在程序中手動創建對象的控制權,交由Spring框架來管理。 IoC 在其他語言中也有應用,并非 Spring 特有。 IoC 容器是 Spring 用來實現 IoC 的載體, IoC 容器實際上就是個Map(key,value),Map 中存放的是各種對象。
將對象之間的相互依賴關系交給 IoC 容器來管理,并由 IoC 容器完成對象的注入。這樣可以很大程度上簡化應用的開發,把應用從復雜的依賴關系中解放出來。 IoC 容器就像是一個工廠一樣,當我們需要創建一個對象的時候,只需要配置好配置文件/注解即可,完全不用考慮對象是如何被創建出來的。
AOP(Aspect-Oriented Programming:面向切面編程)能夠將那些與業務無關,卻為業務模塊所共同調用的邏輯或責任(例如事務處理、日志管理、權限控制等)封裝起來,便于減少系統的重復代碼,降低模塊間的耦合度,并有利于未來的可拓展性和可維護性。
Spring AOP就是基于動態代理的,如果要代理的對象,實現了某個接口,那么Spring AOP會使用JDKProxy,去創建代理對象,而對于沒有實現接口的對象,就無法使用 JDK Proxy 去進行代理了,這時候Spring AOP會使用Cglib ,這時候Spring AOP會使用 Cglib 生成一個被代理對象的子類來作為代理
5. Spring 中的 bean 的作用域有哪些?
- singleton : 唯一 bean 實例,Spring 中的 bean 默認都是單例的。
- prototype : 每次請求都會創建一個新的 bean 實例。
- request : 每一次HTTP請求都會產生一個新的bean,該bean僅在當前HTTP request內有效。
- session : 每一次HTTP請求都會產生一個新的 bean,該bean僅在當前 HTTP session 內有效。
- global-session: 全局session作用域,僅僅在基于portlet的web應用中才有意義,Spring5已經沒有了。Portlet是能夠生成語義代碼(例如:HTML)片段的小型Java Web插件。它們基于portlet容器,可以像servlet一樣處理HTTP請求。但是,與 servlet 不同,每個 portlet 都有不同的會話
6. Spring 中的單例 bean 的線程安全問題了解嗎
- 單例 bean 存在線程問題,主要是因為當多個線程操作同一個對象的時候,對這個對象的非靜態成員變量的寫操作會存在線程安全問題。
- 常見的有兩種解決辦法:
7. @Component 和 @Bean 的區別是什么?
8. 將一個類聲明為Spring的 bean 的注解有哪些?
@Component :通用的注解,可標注任意類為 Spring 組件。如果一個Bean不知道屬于哪個層,可以使用 @Component 注解標注。
@Repository : 對應持久層即 Dao 層,主要用于數據庫相關操作。
@Service : 對應服務層,主要涉及一些復雜的邏輯,需要用到 Dao層。
@Controller : 對應 Spring MVC 控制層,主要用戶接受用戶請求并調用 Service 層返回數據給前端頁面。
9. Spring 中的 bean 生命周期?
- Bean 容器找到配置文件中 Spring Bean 的定義。
- Bean 容器利用 Java Reflection API 創建一個Bean的實例。
- 如果涉及到一些屬性值 利用 set() 方法設置一些屬性值。
- 如果 Bean 實現了 BeanNameAware 接口,調用 setBeanName() 方法,傳入Bean的名字。
- 如果 Bean 實現了 BeanClassLoaderAware 接口,調用 setBeanClassLoader() 方法,傳入ClassLoader 對象的實例。
- 與上面的類似,如果實現了其他 *.Aware 接口,就調用相應的方法。
- 如果有和加載這個 Bean 的 Spring 容器相關的 BeanPostProcessor 對象,執行
postProcessBeforeInitialization() 方法 - 如果Bean實現了 InitializingBean 接口,執行 afterPropertiesSet() 方法。
- 如果 Bean 在配置文件中的定義包含 init-method 屬性,執行指定的方法。
- 如果有和加載這個 Bean的 Spring 容器相關的 BeanPostProcessor 對象,執行
postProcessAfterInitialization() 方法 - 當要銷毀 Bean 的時候,如果 Bean 實現了 DisposableBean 接口,執行 destroy() 方法。
- 當要銷毀 Bean 的時候,如果 Bean 在配置文件中的定義包含 destroy-method 屬性,執行指定的方法。
這篇文章如果對小伙伴們有幫助的話,希望點個贊支持一下~ 十分感謝~
總結
以上是生活随笔為你收集整理的2022最新Spring相关大厂常问技术面试题大全 —— 金三银四好时机的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 历史会重演?今年的我国,还会像2008年
- 下一篇: 【你会用代码画年兽吗】20行代码使用JS