SSM與SpringBoot面試題總結

  • 什么是spring?談談你對IOC和AOP的理解。

Spring:是一個企業級java應用框架,他的作用主要是簡化軟件的開發以及配置過程,簡化項目部署環境。

Spring的優點:

1、Spring低侵入設計,對業務代碼的污染非常低。

2、Spring的DI機制將對象之間的關系交由框架處理,減少組件的耦合。

3、Spring提供了AOP技術,支持將一些通用的功能進行集中式管理,從而提供更好的復用。

4、Spring對于主流框架提供了非常好的支持。

IOC就是控制反轉,指創建對象的控制權轉移給Spring來進行管理。簡單來說,就是應用不用去new對象了,而全部交由 Spring自動生產。

IOC有三種注入方式:1、構造器注入2、setter方法注入3、根據注解注入。

AOP 面向切面。用于將那些與業務無關,但卻對多個對象產生影響的公共行為。抽取并封裝成一個可重用的模塊。AOP的核心就是動態代理。JDK的動態代理和 CGLIB動態代理。

  • 什么是bean的自動裝配,有哪些方式?

開啟自動裝配,只需要在xml配置文件<bean>中定義“autowire"屬性。

<bean id="cutomer"c1ass="com.xxx.xxx.Customer" autowire=""/>

autowire屬性有五種裝配的方式:

·no-缺省情況下,自動配置是通過“ref”屬性手動設定

手動裝配:以value或ref的方式明確指定屬性值都是手動裝配。

需要通過‘ref'屬性來連接bean。

·byName-根據bean的屬性名稱進行自動裝配。

Cutomer的屬性名稱是person,Spring會將bean id為person的bean通過setter方法進行自動裝配。

<bean id="cutomer"c1ass="com.xxx.xxx.Cutomer" autowire="byName"/>

<bean id="person" c1ass="com.xxx.xxx.Person"/>

·byType-根據bean的類型進行自動裝配。

Cutomer的屬性person的類型為Person,Spirng會將Person類型通過setter方法進行自動裝配。

<bean id="cutomer" class="com.xxx.xxx.Cutomer" autowire="byType"/>

<bean id="person" class="com.xxx.xxx.Person"/>

.constructor-類似byType,不過是應用于構造器的參數。如果一個bean與構造器參數的類型形同,則進行自動裝配,否則導致異常。

Cutomer構造函數的參數person的類型為Person,Spirng會將Person類型通過構造方法進行自動裝配。

<bean id="cutomer"class="com.xxx.xxx.Cutomer"autowire="construtor"/>

<bean id="person" c1ass="com.xxx.xxx.Persc

autodetect-如果有默認的構造器,則通過constructor方式進行自動裝配,否則使用byType方式進行自動裝配。

如果有默認的構造器,則通過constructor方式進行自動裝配,否則使用byType方式進行自動裝配。

@Autowired自動裝配bean,可以在字段、setter方法、構造函數上使用。

  • 如何理解Spring Boot中的Starter

使用spring+springmvc使用,如果需要引入mybatis等框架,需要到xml中定義mybatis需要的bean

starter就是定義一個starter的jar包,寫一個@Configuration配置類、將這些bean定義在里面,然后在starte包的META-INFspring.factories中寫入該配置類,springboot會按照約定來加載該配置類

開發人員只需要將相應的starter包依賴進應用,進行相應的屬性配置(使用默認配置時,不需要配置),就可以直接進行代碼開發,使用對應的功能了,比如mybatis-spring-boot--starter, spring-boot-starter-redis

  • 如何實現一個IOC容器

1、配置文件配置包掃描路徑

2、遞歸包掃描獲取.class文件

3、反射、確定需要交給IOC管理的類

4、對需要注入的類進行依賴注入

  1. ·配置文件中指定需要掃描的包路徑
  2. ·定義一些注解,分別表示訪問控制層、業務服務層、數據持久層、依賴注入注解、獲取配置文件注解
  3. ·從配置文件中獲取需要掃描的包路徑,獲取到當前路徑下的文件信息及文件夾信息,我們將當前路徑下所有以.class結尾的文件添加到一個Set集合中進行存儲
  4. ·遍歷這個set集合,獲取在類上有指定注解的類,并將其交給IOC容器,定義一個安全的Map用來存儲這些對象
  5. ·遍歷這個IOC容器,獲取到每一個類的實例,判斷里面是有有依賴其他的類的實例,然后進行遞歸注入

  • 京東一面:Spring中bean是線程安全的嗎?

Spring本身并沒有針對bean做線程安全的處理,所以:

  1. 如果bean是無狀態的,那么bean是線程安全的。
  2. 如果bean是有狀態的,則bean不是線程安全的。

另外,bean是不是線程安全,跟bean的作用域沒有關系,bean的作用域只是表示bean的生命周期的范圍,對于任何生命周期的bean都是一個對象,這個對象是不是線程安全的,還是得看這個bean對象本身。

  • 談談你對IOC的理解

容器概念、控制反轉、依賴注入

ioc容器:實際上就是個map (key,value),里面存的是各種對象(在xml里配置的bean節點、@repository、@service、@controller、@component),在項目啟動的時候會讀取配置文件里面的bean節點,根據全限定類名使用反射創建對象放到map里、掃描到打上上述注解的類還是通過反射創建對象放到map里。

這個時候map里就有各種對象了,接下來我們在代碼里需要用到里面的對象時,再通過DI注入(autowired、resource等注解,xml里bean節點內的ref屬性,項目啟動的時候會讀取xml節點ref屬性根據id注入,也會掃描這些注解,根據類型或id注入;id就是對象名)。

控制反轉:

沒有引入IOC容器之前,對象A依賴于對象B,那么對象A在初始化或者運行到某一點的時候,自己必須主動去創建對象B或者使用已經創建的對象B。無論是創建還是使用對象B,控制權都在自己手上。

引入IOC容器之后,對象A與對象B之間失去了直接聯系,當對象A運行到需要對象B的時候,IOC容器會主動創建一個對象B注入到對象A需要的地方。

通過前后的對比,不難看出來:對象A獲得依賴對象B的過程,由主動行為變為了被動行為,控制權顛倒過來了,這就是“控制反轉”這個名稱的由來。

全部對象的控制權全部上交給"第三方”IOC容器,所以,IOC容器成了整個系統的關鍵核心,它起到了一種類似”粘合劑”的作用,把系統中的所有對象粘合在一起發揮作用,如果沒有這個“粘合劑”,對象與對象之間會彼此失去聯系,這就是有人把IOC容器比喻成"粘合劑”的由來。

依賴注入:

“獲得依賴對象的過程被反轉了”。控制被反轉之后,獲得依賴對象的過程由自身管理變為了由IOC容器主動注入。依賴注入是實現IOC的方法,就是由IOC容易在運行期間,動態地將某種依賴關系注入到對象之中。

  • 阿里一面:介紹一下Spring,讀過源碼介紹一下大致流程

1.Spring是一個快速開發框架,Spring幫助程序員來管理對象

2.Spring的源碼實現的是非常優秀的,設計模式的應用、并發安全的實現、面向接口的設計等

3.在創建Spring容器,也就是啟動Spring時:

a.首先會進行掃描,掃描得到所有的BeanDefinition對象,并存在一個Map中

b.然后篩選出非懶加載的單例BeanDefinition進行創建Bean,對于多例Bean不需要在啟動過程中去進行創建,對于多例Bean會在每次獲取Bean時利用BeanDefinition去創建

c.利用BeanDefinition創建Bean就是Bean的創建生命周期,這期間包括了合并BeanDefinition、推斷構造方法、實例化、屬性填充、初始化前、初始化、初始化后等步驟,其中AOP就是發生在初始化后這一步驟中

4.單例Bean創建完了之后,Spring會發布一個容器啟動事件

5.Spring啟動結束

6.在源碼中會更復雜,比如源碼中會提供一些模板方法,讓子類來實現,比如源碼中還涉及到一些BeanFactoryPostProcessor和BeanPostProcessor的注冊,Spring的掃描就是通過BenaFactoryPostProcessor來實現的,依賴注入就是通過BeanPostProcessor來實現的

7.在Spring啟動過程中還會去處理@lmport等注解

  • 描述一下Srping Bean的生命周期

  1. 解析類得到BeanDefinition
  2. 如果有多個構造方法,則要推斷構造方法
  3. 確定好構造方法后,進行實例化得到一個對象
  4. 對對象中的加了@Autowired注解的屬性進行屬性賦值
  5. 回調Aware方法,比如BeanNameAware、BeanFactoryAware
  6. 調用BeanPostProcessor的初始化前的方法
  7. 調用初始化方法
  8. 調用BeanPostProcesspr的初始化后的方法,在這里進行AOP
  9. 如果當前創建的bean是單例的則會把bean放入單例池
  10. 使用bean
  11. Spring容器關閉時調用DisposableBean中destory()方法

  • 京東二面:Spring用到了哪些設計模式

  • 談談你對AOP的理解

系統是由許多不同的組件所組成的,每一個組件各負責一塊特定功能。除了實現自身核心功能之外,這些組件還經常承擔著額外的職責。例如日志、事務管理和安全這樣的核心服務經常融入到自身具有核心業務邏輯的組件中去。這些系統服務經常被稱為橫切關注點,因為它們會跨越系統的多個組件。

當我們需要為分散的對象引入公共行為的時候,OOP則顯得無能為力。也就是說,OOP允許你定義從上到下的關系,但并不適合定義從左到右的關系。例如日志功能。

日志代碼往往水平地散布在所有對象層次中,而與它所散布到的對象的核心功能毫無關系。

在OOP設計中,它導致了大量代碼的重復,而不利于各個模塊的重用。

AOP:將程序中的交叉業務邏輯(比如安全,日志,事務等),封裝成一個切面,然后注入到目標對象(具體業務邏輯)中去。AOP可以對某個對象或某些對象的功能進行增強,比如對象中的方法進行增強,可以在執行某個方法之前額外的做一些事情,在某個方法執行之后額外的做一些事情

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

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

相關文章

FPGA設計時序約束十一、others類約束之Set_Maximum_Time_Borrow

目錄 一、序言 二、Set Maximum Time Borrow 2.1 基本概念 2.2 設置界面 2.3 命令語法 2.4 命令示例 三、參考資料 一、序言 在Vivado的時序約束窗口中&#xff0c;存在一類特殊的約束&#xff0c;劃分在others目錄下&#xff0c;可用于設置忽略或修改默認的時序路徑分析…

IntelliJ IDEA開啟git版本控制的簡單教程

這篇文章想要分享一下怎么在IntelliJ IDEA開啟版本控制&#xff0c;博主使用的是gitee&#xff0c;首先需要安裝git&#xff0c;關于git的安裝這里就不介紹了&#xff0c;很簡單。 目錄 創建git倉庫 創建項目 開啟版本控制 拉取項目 創建git倉庫 首先&#xff0c;需要登錄…

《Linux中lsof的神奇探秘:打開文件的魔法與更多相似利器》

前言 在Linux的世界里&#xff0c;lsof&#xff08;List Open Files&#xff09;是一個強大的工具&#xff0c;它能幫助我們輕松查看系統上打開的文件及網絡連接。然而&#xff0c;除了lsof之外&#xff0c;還有一些與它功能相似且同樣強大的命令等待著我們去發現。本文將引領…

MATLAB | 官方舉辦的動圖繪制大賽 | 第四周(收官周)賽情回顧

MATHWORKS官方舉辦的迷你黑客大賽第三期(MATLAB Flipbook Mini Hack)圓滿結束&#xff0c;雖然我的水平和很多大佬還有比較大的差距&#xff0c;但所有獎也算是拿滿了&#xff1a; 專家評選前三名&#xff0c;以及投票榜前十&#xff1a;~ 每周的階段性獲獎者&#xff1a; 下面…

【Python】手把手教你用tkinter設計圖書管理登錄UI界面(三)

上一篇&#xff1a;【Python】手把手教你用tkinter設計圖書管理登錄UI界面&#xff08;二&#xff09;-CSDN博客 下一篇&#xff1a; 緊接上一篇文章&#xff0c;繼續完善項目功能&#xff1a;用戶登錄。由于老王的注冊部分有億點點復雜&#xff0c;還沒完成&#xff0c;但是…

ngixn 準備

確認yum可用&#xff0c;確認防火墻&#xff0c;確認SELinux 一項安裝 yum -y install gcc make automake pcre-devel zlib zlib-devel openssl openssl-devel參數&#xff1a; gcc&#xff1a;編譯依賴gcc環境 pcre&#xff1a;PCRE(Perl Compatible Regular Expressions)是一…

鴻蒙OS應用開發的開發環境

鴻蒙OS應用開發的開發環境 鴻蒙系統發展越來越快&#xff0c;已經開始走進千家萬戶&#xff0c;從手機到電視機&#xff0c;再到汽車&#xff0c;以后各種手表、智能設備等等。這已經是一個廣泛應用的操作系統&#xff0c;也是跟大家生活密切相關的操作系統。要想在這個平臺上…

Git命令---查看遠程倉庫

介紹 使用git命令查看綁定的遠程倉庫。 命令 git remote -v

Kubernetes里的DNS;API資源對象ingress;Kubernetes調度;節點選擇器NodeSelector;節點親和性NodeAffinity

Kubernetes里的DNS K8s集群內有一個DNS服務&#xff1a; kubectl get svc -n kube-system |grep dns測試&#xff1a; 在tang3上安裝bind-utils,目的是安裝dig命令 yum install -y bind-utils apt install dnsutils #ubuntu上 解析外網域名 dig 10.15.0.10 www.baidu.com…

NSSCTF-Crypto靶場練習--第11-20題wp

文章目錄 [SWPUCTF 2021 新生賽]traditional[LitCTF 2023]夢想是紅色的 (初級)[SWPUCTF 2021 新生賽]crypto2[羊城杯 2021]Bigrsa[LitCTF 2023]Hex&#xff1f;Hex&#xff01;(初級)[SWPU 2020]happy[AFCTF 2018]BASE[安洵杯 2019]JustBase[鶴城杯 2021]Crazy_Rsa_Tech[SWPUCT…

順序表的應用

1. 順序表 1.1 寫法1 Linear_Opeartor2.c #include "stdio.h" #include "stdlib.h" #include "stdbool.h" #include "string.h" //順序表//申明順序表的大小 #define MAXSIZE 5 typedef bool status; //創建順序表 int *Linear_Creat…

DockerFile中途執行出錯的解決辦法

DockerFile中途執行出錯的解決辦法 你們是否也曾經因為DockerFile中途執行出錯,而對其束手無策?總是對docker避之不及! 但是當下載的源碼運用到了docker,dockerFile 執行到一半,報錯了怎么辦? 現狀 那么當DockerFile執行一半出錯后,會產生什么結果呢? 如圖可知,生成…

我們常說的流應用到底是什么?

流應用是DCloud公司開發的一種可以讓手機App安裝包實現邊用邊下的技術。基于HTML5規范的即點即用應用&#xff0c;開發者按照HTML5規范開發的應用&#xff0c;可以在支持HTML5流應用的發行渠道實現即點即用的效果。 流應用是基于 HTML5規范的即點即用應用&#xff0c;開發者按照…

Nacos注冊中心客戶端容災

目前Nacos客戶端有一個FailoverReactor來進行容災文件的管理&#xff0c;可以通過在指定磁盤文件里寫入容災數據來進行客戶端使用數據的覆蓋。FailoverReactor目前會攔截Nacos客戶端查詢接口調用&#xff0c;以getAllInstances接口為例&#xff0c;目前FailoverReactor的工作流…

【合集】SpringBoot——Spring,SpringBoot,SpringCloud相關的博客文章合集

前言 本篇博客是spring相關的博客文章合集&#xff0c;內容涵蓋Spring&#xff0c;SpringBoot&#xff0c;SpringCloud相關的知識&#xff0c;包括了基礎的內容&#xff0c;比如核心容器&#xff0c;springMVC&#xff0c;Data Access&#xff1b;也包括Spring進階的相關知識&…

免費的網頁數據抓取工具有哪些?【2024附下載鏈接】

在網絡上&#xff0c;有許多網頁數據抓取工具可供選擇。本文將探討其如何全網采集數據并支持指定網站抓取。我們將比較不同的數據采集工具&#xff0c;幫助您找到最適合您需求的工具。 網頁數據抓取工具種類 在選擇網頁數據抓取工具之前&#xff0c;讓我們先了解一下這些工具…

TC397 EB MCAL開發從0開始系列 之 [21.2] FlsLoader配置實戰 - 擦除讀寫Pflash

一、FlsLoader配置1、配置目標2、目標依賴2.1 硬件使用2.2 軟件使用2.3 新增模塊3、EB配置3.1 配置講解3.2 模塊配置3.2.1 MCU配置3.2.2 PORT配置3.2.3 FlsLoader配置3.2.5 Irq配置3.2.6 ResourceM配置4、ADS代碼編寫及調試<

[ 藍橋杯Web真題 ]-布局切換

目錄 介紹 準備 目標 規定 思路 解法參考 介紹 經常用手機購物的同學或許見過這種功能&#xff0c;在瀏覽商品列表的時候&#xff0c;我們通過點擊一個小小的按鈕圖標&#xff0c;就能快速將數據列表在大圖&#xff08;通常是兩列&#xff09;和列表兩種布局間來回切換。…

電機:有刷直流電機的原理

一、什么是有刷直流電機 直流有刷電機&#xff08;Brushed DC Motor&#xff09;&#xff0c;定子是用永磁鐵或者線圈做成&#xff0c;以形成固定磁場。在定子一端上有固定碳刷&#xff0c;或者銅刷&#xff0c;負責把外部電流引入轉子線圈。而轉子是由線圈構成&#xff0c;線…

郵件營銷軟件:10個創新郵件營銷策略,提升投資回報率(一)

電子商務和電子郵件營銷密不可分。盡管電子商務在蓬勃發展&#xff0c;而很多人對郵件營銷頗有微詞。但是在電子商務中&#xff0c;郵件營銷的確是一種有效營銷方式。在本文中&#xff0c;我們將討論一下郵件營銷在電子商務中的有效運用&#xff0c;幫助您的企業在今年盡可能地…