springboot相關(guān)面試題匯總詳解
springboot和springmvc的區(qū)別
spring boot 內(nèi)嵌tomcat,Jetty和Undertow容器,可以直接運行起來,不在再做部署;
spring boot 自動配置,減少了xml文件的大量配置;降低了項目搭建的復雜度
Spring MVC是基于 Servlet 的一個 MVC 框架 主要解決 WEB 開發(fā)的問題,因為 Spring 的配置非常復雜,各種XML、 JavaConfig、hin處理起來比較繁瑣。于是為了簡化開發(fā)者的使用,從而創(chuàng)造性地推出了Spring boot,約定優(yōu)于配置,簡化了spring的配置流程。
Spring 是一個“引擎”;
Spring MVC 是基于Spring的一個 MVC 框架 ;
Spring Boot 是基于Spring4的條件注冊的一套快速開發(fā)整合包。
springboot熱部署的兩種方式
SpringBoot 1.3后才擁有SpringBoot devtools熱部署
①:spring-boot-devtools ②:Spring Loaded
方式一:
在項目的pom文件中添加依賴:
<!--熱部署jar--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
然后:使用 shift+ctrl+alt+"/" (IDEA中的快捷鍵) 選擇"Registry" 然后勾選 compiler.automake.allow.when.app.running
方式二:
在項目中添加如下代碼
<build> <plugins> <plugin> <!-- springBoot編譯插件--> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> <dependencies> <!-- spring熱部署 --> <!-- 該依賴在此處下載不下來,可以放置在build標簽外部下載完成后再粘貼進plugin中 --> <dependency> <groupId>org.springframework</groupId> <artifactId>springloaded</artifactId> <version>1.2.6.RELEASE</version> </dependency> </dependencies> </plugin> </plugins> </build>
添加完畢后需要使用mvn指令運行:
首先找到IDEA中的Edit configurations ,然后進行如下操作:(點擊左上角的"+",然后選擇maven將出現(xiàn)右側(cè)面板,在紅色劃線部位輸入如圖所示指令,你可以為該指令命名(此處命名為MvnSpringBootRun))
點擊保存將會在IDEA項目運行部位出現(xiàn),點擊綠色箭頭運行即可
springboot配置文件
spring boot使用一個全局配置文件:主要是以下兩種類型
application.properties :例:server.port=9998
application.yml(YAML) :例:server:
port:8080
配置文件的作用主要是修改spring boot在底層的默認配置
Spring Boot 的核心注解
啟動類上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要組合包含了以下 3 個注解:
@SpringBootConfiguration:組合了 @Configuration 注解,實現(xiàn)配置文件的功能。
@EnableAutoConfiguration:打開自動配置的功能,也可以關(guān)閉某個自動配置的選項,如關(guān)閉數(shù)據(jù)源自動配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring組件掃描。
spring boot的starter的執(zhí)行原理
利用starter實現(xiàn)自動化配置只需要兩個條件——maven依賴、配置文件,這里簡單介紹下starter實現(xiàn)自動化配置的流程。
引入maven實質(zhì)上就是導入jar包,spring-boot啟動的時候會找到starter jar包中的resources/META-INF/spring.factories文件,根據(jù)spring.factories文件中的配置,找到需要自動配置的類
Spring Boot與Spring MVC的區(qū)別
- Spring Boot是Spring和Spring MVC的整合,而Spring MVC只是Spring的一個模塊,一個輕量級的Web層框架
- Spring Boot幾乎可以實現(xiàn)零配置,所有功能使用注解進行開發(fā),運用了'約定大于配置'的思想,簡化了項目開發(fā)
- 難度,而Spring MVC需要依賴于xml配置進行開發(fā)
- Spring Boot提供了內(nèi)置的tomcat,可以打成jar包直接運行,也可以使用外置tomcat
- Spring Boot還繼承了許多第三方庫配置,例如,JDBC, Mongo, Redis等,應用這些第三方庫,幾乎可以零配置
springcloud的服務注冊和發(fā)現(xiàn)是怎樣的原理
Eureka包含兩個組件:Eureka Server和Eureka Client
Eureka Server提供服務注冊服務
各個節(jié)點啟動后,會在EurekaServer中進行注冊,這樣EurekaServer中的服務注冊表中將會存儲所有可用服務節(jié)點的信息,服務節(jié)點的信息可以在界面中直觀的看到
EurekaClient是一個Java客戶端,用于簡化Eureka Server的交互,客戶端同時也具備一個內(nèi)置的、使用輪詢(round-robin)負載算法的負載均衡器。在應用啟動后,將會向Eureka Server發(fā)送心跳(默認周期為30秒)。如果Eureka Server在多個心跳周期內(nèi)沒有接收到某個節(jié)點的心跳,EurekaServer將會從服務注冊表中把這個服務節(jié)點移除(默認90秒)
Eureka三大角色:
- Eureka Server 提供服務注冊和發(fā)現(xiàn)
- Service Provider服務提供方將自身服務注冊到Eureka,從而使服務消費方能夠找到
- Service Consumer服務消費方從Eureka獲取注冊服務列表,從而能夠消費服務
作為服務注冊中心,Eureka 和 Zookeeper對比的優(yōu)勢:
著名的CAP理論指出,一個分布式系統(tǒng)不可能同時滿足C(一致性)、A(可用性)和P(分區(qū)容錯性)。由于分區(qū)容錯性P在是分布式系統(tǒng)中必須要保證的,因此我們只能在A和C之間進行權(quán)衡。
因此
- Zookeeper保證的是CP,
- Eureka則是AP
mybatis中的#和$的區(qū)別
#相當于對數(shù)據(jù) 加上 雙引號,$相當于直接顯示數(shù)據(jù)
- #將傳入的數(shù)據(jù)都當成一個字符串,會對自動傳入的數(shù)據(jù)加一個雙引號。如:order by #user_id#,如果傳入的值是111,那么解析成sql時的值為order by "111", 如果傳入的值是id,則解析成的sql為order by "id".
- $將傳入的數(shù)據(jù)直接顯示生成在sql中。如:order by $user_id$,如果傳入的值是111,那么解析成sql時的值為order by user_id, 如果傳入的值是id,則解析成的sql為order by id.
- 3#方式能夠很大程度防止sql注入。
- $方式無法防止Sql注入。
- $方式一般用于傳入數(shù)據(jù)庫對象,例如傳入表名.
- 一般能用#的就別用$.
MyBatis排序時使用order by 動態(tài)參數(shù)時需要注意,用$而不是#
字符串替換
默認情況下,使用#{}格式的語法會導致MyBatis創(chuàng)建預處理語句屬性并以它為背景設(shè)置安全的值(比如?)。這樣做很安全,很迅速也是首選做法,有時你只是想直接在SQL語句中插入一個不改變的字符串。比如,像ORDER BY,你可以這樣來使用:
ORDER BY ${columnName}
這里MyBatis不會修改或轉(zhuǎn)義字符串。
Redis怎樣淘汰數(shù)據(jù)
- volatile-lru :從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選最近最少使用的數(shù)據(jù)淘汰
- volatile-ttl:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中挑選將要過期的數(shù)據(jù)淘汰
- volatile-random:從已設(shè)置過期時間的數(shù)據(jù)集(server.db[i].expires)中隨機挑選數(shù)據(jù)淘汰
- allkeys-lru:從數(shù)據(jù)集(server.db[i].dict)中挑選最近最少使用的數(shù)據(jù)淘汰
- allkeys-random:從數(shù)據(jù)集(server.db[i].dict)中隨機挑選數(shù)據(jù)淘汰
- no-envivtion(驅(qū)逐):禁止驅(qū)逐數(shù)據(jù)
LRU機制:
redis保存了lru計數(shù)器server.lrulock,會定時的去更新(redis定時程序severCorn()),每個redis對象都會設(shè)置相應的lru值,每次訪問對象的時候,redis都會更新redisObject.lru。
LRU淘汰機制:在數(shù)據(jù)集中隨機挑選幾個鍵值對,取出其中l(wèi)ru最大的鍵值對淘汰。所以,redis并不能保證淘汰的數(shù)據(jù)都是最近最少使用的,而是隨機挑選的鍵值對中的。
TTL機制:
redis數(shù)據(jù)集結(jié)構(gòu)中保存了鍵值對過期時間表,即 redisDb.expires。
TTL淘汰機制:在數(shù)據(jù)集中隨機挑選幾個鍵值對,取出其中最接近過期時間的鍵值對淘汰。所以,redis并不能保證淘汰的數(shù)據(jù)都是最接近過期時間的,而是隨機挑選的鍵值對中的。
redis在每服務客戶端執(zhí)行一個命令的時候,會檢測使用的內(nèi)存是否超額
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
SpringBoot集成elasticsearch使用圖文詳解
Spring Boot集成Elasticsearch其實非常簡單,這篇文章主要給大家介紹了關(guān)于SpringBoot集成elasticsearch使用的相關(guān)資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-04-04
詳解elasticsearch之metric聚合實現(xiàn)示例
這篇文章主要為大家介紹了elasticsearch之metric聚合實現(xiàn)示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-01-01

