SpringBoot 階段測試 1

SpringBoot 階段測試 1

目錄

1、使用JDK8新語法完成下列集合練習:

1.1 List中有1,2,3,4,5,6,7,8,9幾個元素要求;

(1) 將奇、偶數分別匯聚成一個List

//初始化集合
List<Integer> numList = new ArrayList<>();
//批量添加數據
Collections.addAll(numList,1,2,3,4,5,6,7,8,9,10);
//或者
//List<Integer> numList = Arrays.asList(1, 2, 3, 4, 5, 6, 7, 8, 9, 10);

//方法一: 使用 forEach
List<Integer> oddList = new ArrayList<>();
List<Integer> evenList = new ArrayList<>();
numList.forEach(num-> {
    boolean temp = (num%2 == 1) ? oddList.add(num) : evenList.add(num);
});

log.info("numList:{}",numList); //numList:[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
log.info("oddList:{}",oddList); //oddList:[1, 3, 5, 7, 9]
log.info("evenList:{}",evenList); //evenList:[2, 4, 6, 8, 10]

//方法二: 使用 filter 過濾 + collect 收集
List<Integer> oddList2 =  numList.stream().filter(num -> num%2==1).collect(Collectors.toList());
List<Integer> evenList2 = numList.stream().filter(num -> num%2==0).collect(Collectors.toList());

log.info("oddList2:{}",oddList2); //oddList2:[1, 3, 5, 7, 9]
log.info("evenList2:{}",evenList2); //evenList2:[2, 4, 6, 8, 10]

(2) 分別求出奇數和偶數的和

//奇數集合
//使用選出來的奇數求和
Optional<Integer> oddSum = oddList.stream().reduce((n, m) -> n + m);
log.info("使用選出來的奇數求和 oddSum:{}",oddSum.get());
//使用選出來的奇數求和 oddSum:25

//使用源集合 求和
oddSum = numList.stream().filter(num -> num % 2 == 1).reduce((n, m) -> n + m);
log.info("使用源集合 求和 oddSum:{}",oddSum.get());
//使用源集合 求和 oddSum:25

//偶數集合
//使用選出來的偶數 求奇數和
Optional<Integer> evenSum = evenList.stream().reduce((n, m) -> n + m);
log.info("使用選出來的偶數 求奇數和 evenSum:{}",evenSum.get());
//使用選出來的偶數 求奇數和 evenSum:30

//使用源集合 求偶數和
evenSum = numList.stream().filter(num->num%2 == 0).reduce((n,m)->n+m);
log.info("使用源集合 求偶數和 evenSum:{}",evenSum.get());
//使用源集合 求偶數和 evenSum:30

1.2 已知集合:[[1,3,5,7,5,3,11],[2,4,6,8,6,4,2],[5,8,7]]要求:

1.2.1 集合轉換:[“1″,”3″,”5″,”7″,”5″,…,”5”, “8”,”7″]。

List<List<Integer>> oldList = new ArrayList<>();
Collections.addAll(oldList,Arrays.asList(1,3,5,7,5,3,11),Arrays.asList(2,4,6,8,6,4,2),Arrays.asList(5,8,7));

List<String> newList = new ArrayList<>();
oldList.forEach(num->num.forEach(n->newList.add("\""+n+"\"")));
//或
//oldList.forEach(nums->nums.stream().map(n -> "\""+n+"\"").forEach(n->newList.add(n)));

log.info("oldList:{}",oldList); //oldList:[[1, 3, 5, 7, 5, 3, 11], [2, 4, 6, 8, 6, 4, 2], [5, 8, 7]]
log.info("newList:{}",newList); //newList:["1", "3", "5", "7", "5", "3", "11", "2", "4", "6", "8", "6", "4", "2", "5", "8", "7"]

2、springboot框架下的為什麼有些依賴是不需要版本號的?

springboot框架下的為什麼有些依賴是不需要版本號的:
	SpringBoot框架的版本仲裁中心,對一些依賴進行了版本可控制和衝突處理,版本控制中心沒有的需要自定義依賴版本;

3、springboot核心註解是什麼,深入介紹下這個註解。

@SpringBootConfiguration: springboot的配置
	@Configuration: spring配置類
		@Component: 說明也是一個spring的組件
@EnableAutoConfiguration: 自動配置
	@AutoConfigurationPackage: 自動配置包
		@Import({Registrar.class}): 導入自動配置包註冊 導入著啟動類同包及其子內中的所有組件
	@Import({AutoConfigurationImportSelector.class}): 導入自動配置導入選擇器
		List<String> configurations = this.getCandidateConfigurations(annotationMetadata, attributes);//獲取所有的配置
@ComponentScan(excludeFilters = {  : //按條件剔除一部分組件
	@Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
	@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })

4、pringboot為什麼可以打包成可執行的jar,執行命令是什麼?

Spring Boot 打包成Jar包運行的原理://blog.csdn.net/y5492853/article/details/123758851

4.1 MANIFEST.MF的主要內容:

xxx.jar/META-INFO/MANIFEST.MF

jar包啟動類:
	Main-Class: org.springframework.boot.loader.JarLauncher
主啟動類:
	Start-Class: com.kgc.scd.Edocmall96WebApplication

JarLauncher:
    根據 Start-Class
    通過反射拿到了項目的啟動類的main方法
    從而啟動本地項目

4.2 執行命令

執行命令:
	java -jar xxx.jar

可以添加參數:
    java -jar xxx.jar --server.port=8081
    java -jar -Dserver.port=8081 xxx.jar

5、Springboot的配置文件是哪個?你知道有哪些格式,這些格式的優先級是什麼?配置過哪些內容?

5.1Springboot的配置文件

Springboot的配置文件是哪個:
	application

5.2 Springboot的配置文件格式,和優先級

Springboot的配置文件格式:
	application.properties,application.yml,
	bootstrap.properties,bootstrap.yml

優先級:
	bootstrap.properties>bootstrap.yml>application.properties>application.yml

    
配置文件路徑優先級:
	項目根路徑下的confing下 > 項目根路徑下 > 項目類路徑(resource)下的confing下 > 項目類路徑下

5.3 配置過哪些內容

1、項目基本配置: 
	項目基本信息

2、數據庫相關配置:
	mybatis
	mybatis-plus
	jpa
	逆向工程

3、組件相關:
	dubbo
	zookeeper
	eureka
	feign
	hytrix
	ribbon
	zuul
	config配置中心

4、一些官方接口線管:
	微信相關
	支付寶相關
	驗證碼相關
	短訊相關

5、自定義配置:
	一些方便修改的統一配置

6、日誌有哪些級別。springboot的默認日誌框架是什麼?項目中是如何使用的?

日誌有哪些級別: trace < dubug < info < warn < error

springboot的默認日誌框架是什麼: Sl4j + logback

默認日誌級別是: info

項目中是如何使用的: 
	實例化日誌對象: Logger logger = LoggerFactory.getLogger(getClass());
	添加註解: @Sl4j

7、springboot中你知道有哪些方式可以用來讀取配置文件?他們的區別是什麼?

讀取配置文件方式:
	批量讀取: @ConfigurationProperties(prefix="xxx")
	單個讀取: @Value("${xxx}")
		如果需要指定配置文件:@PropertySource(value="classpath:xxx.properties")
		
區別: 
	批量獲取: 支持鬆散綁定,支持複雜類型綁定,支持數據格式校驗

8、你覺得在哪些業務中可以使用定時任務,在springboot中如何實現定時任務?

哪些業務中可以使用定時任務: 
	訂單審核、出庫、訂單超時自動取消與退款
	優惠卷生成、發放與過期
	物流信息推送與狀態刷新
	數據積壓監控、日誌監控、服務可用性探測作業
	定時備份與更新數據
	金融系統每天的定時結算
	按月批量統計報表數據
	
什麼業務下需要要定時任務: //www.csdn.net/tags/MtjaEg3sNjEzMjUtYmxvZwO0O0OO0O0O.html

springboot中如何實現定時任務:
	方法上添加註解: 
		@Scheduled(fixedDelay=second)
		@Scheduled(fixRate=second)
		@Scheduled(cron="cronPartten")
    主動啟動類上添加註解:
    	@EnableScheduling

9、你覺得在哪些業務中可以使用異步任務,在 springboot中如何實現異步任務?

哪些業務中可以使用異步任務:
	發送短訊驗證碼
	購買成功或者抽獎成功短訊通知
	卡卷或優惠捲髮放
	發送微信紅包
	微信消息通知
	訂單流程處理
	定時批量處理(比如數據同步)
	工作流性質的異步任務(未完成異步任務補償)

異步調用的經典業務場景: //blog.csdn.net/fujuan08093206/article/details/79867367

springboot中如何實現異步任務: 
	方法上添加註解:
		@Async
		開啟異步線程註解,如果是同一個類中的其他方法調用,添加此異步處理註解,異步是不生效的
	主啟動類上添加註解: 
		@EnableAsync

10、redis有哪些數據類型?你常用哪些數據類型?

redis有哪些數據類型:
	string
	list
	set
	hash
	zset
	geospatial
	hyperloglog
	bitmaps

常用哪些數據類型:
	string
	hash
	zset: 比如 做瀏覽記錄
	bitmaps: 比如 每日打卡(佔用內存小)

11、如何在redis中保存一個java對象,又如何把redis中數據變為java對象?

如何在redis中保存一個java對象: 
	將對象轉換為json字符串,存入redis中

如何把redis中數據變為java對象:
	從redis中獲取對象json字符串,再轉為對應的對象
	
注意: 需要自定義對象序列化方式

12、什麼是序列化?為什麼需要序列化,在哪些場景中需要序列化?

什麼是序列化:
	把對象轉換為位元組序列的過程
	將對象的狀態信息轉換為可以存儲或傳輸的形式的過程
什麼是反序列化:
	把位元組序列恢復為對象的過程


為什麼需要序列化:
	序列化的原因是 想將對象轉換成流,方便存儲和在網絡上傳輸。

在哪些場景中需要序列化:
	把內存中的對象狀態保存到一個文件或者數據庫中時候
	用套接字再網絡上傳送對象的時候
	通過RMI傳輸對象的時候(RMI是什麼東西?):RMI總結來說就是遠程調用對象,在一個jvm上調用另一個jvm的對象。
	通過RPC調用接口,獲取對象的時候
	把對象存入redis中的時候

13、redis是單線程還是單進程的?

redis是單線程還是單進程:
	單線程:

redis 為什麼快:
	為什麼redis那麼快?剖析redis快的原因:
	//blog.csdn.net/qq3073959033/article/details/127415029
	//blog.csdn.net/weixin_43001336/article/details/122773260
	
	1.純內存KV操作
	2.單線程操作
	3.I/O 多路復用
	4.Reactor 設計模式
	
那麼為什麼Redis是單線程的:
//blog.csdn.net/weixin_44395707/article/details/106192656
    原因如下:
    1. CPU不是瓶頸:Redis的所有操作都是基於內存的,而CPU不是Redis的瓶頸。在大多數情況下,Redis的瓶頸很可能是機器內存或網絡帶寬的大小。如果我們想要更高的性能,可以使用單線程Redis,我們可以使用集群(多個進程)解決方案。
    2. 並發性:並行性不是支持多個客戶端的唯一策略。Redis使用epoll和事件循環來實現並發策略並節省大量時間而無需上下文切換。
    3. 易於實現:編寫多線程程序可能會更加困難。我們需要為線程添加鎖和同步機制。
    4. 易於部署:單線程應用程序可以部署在至少具有單個CPU內核的任何計算機上。

14、簡述下redis 中 setnx命令的效果或作用?

redis 中 setnx命令的效果或作用:
	只有key不存在的情況下,設置key的值,如key存在,則什麼也不做。
	設置成功返回1,失敗返回0;

redis setnx java_Redis SETNX 命令:
	//blog.csdn.net/weixin_39517289/article/details/114468562

15、介紹下你用redis做過的一些業務,以及為什麼你用redis 做。

用redis做過的一些業務: 
	緩存
	數據共享分佈式
	分佈式鎖
	全局ID
	計數器
	限流
	位統計
	購物車
	用戶消息時間線timeline
	消息隊列
	抽獎
	點贊
	簽到
	打卡
	商品標籤
	商品篩選
	用戶關注
	推薦模型
	排行榜
	
Redis 16 個常見的使用場景:
	//blog.csdn.net/gp_911014/article/details/124744869

16.事務隔離級別有哪些?MySQL的默認隔離級別是?

事務隔離級別有哪些:
	讀未提交
	讀已提交
	可重複讀
	可串行化

MySQL的默認隔離級別是:
	可重複讀
	
臟讀、幻讀和不可重複讀:
//blog.csdn.net/qq_41776884/article/details/81608777
	臟讀: 臟讀就是指當一個事務正在訪問數據,並且對數據進行了修改,而這種修改還沒有提交到數據庫中,這時,另外一個事務也訪問這個數據,然後使用了這個數據。
	不可重複讀: 是指在一個事務內,多次讀同一數據。在這個事務還沒有結束時,另外一個事務也訪問該同一數據。那麼,在第一個事務中的兩次讀數據之間,由於第二個事務的修改,那麼第一個事務兩次讀到的的數據可能是不一樣的。這樣就發生了在一個事務內兩次讀到的數據是不一樣的,因此稱為是不可重複讀。
	幻讀: 是指當事務不是獨立執行時發生的一種現象,例如第一個事務對一個表中的數據進行了修改,這種修改涉及到表中的全部數據行。同時,第二個事務也修改這個表中的數據,這種修改是向表中插入一行新數據。那麼,以後就會發生操作第一個事務的用戶發現表中還有沒有修改的數據行,就好象發生了幻覺一樣.
	提醒:
	臟讀: 
		一個事務讀取到另外一個事務沒有提交的修改數據
	不可重複讀的重點是修改:
		同樣的條件,你讀取過的數據,再次讀取出來發現值不一樣了
	幻讀的重點在於新增或者刪除: 
		同樣的條件,第 1 次和第 2 次讀出來的記錄數不一樣
隔離級別 臟讀 不可重複讀 幻讀
READ-UNCOMMITTED
READ-COMMITTED ×
REPEATABLE-READ × ×
SERIALIZABLE × × ×

17、為什麼要使用統一返回類?

為什麼要使用統一返回類:
	統一返回值類型是接口開發中的一種良好的開發習慣(企業級開發基本都有),統一接口返回值的目的是為了加快開發速率以及形成團隊良好的代碼規範

18、什麼叫物理刪除什麼叫邏輯刪除,分別適用於哪些場景?

物理刪除:
	物理刪除是真正物理地址上的刪除,是將數據從數據庫中移除的操作,也就是刪除的一般意義。
	數據被物理刪除後在數據庫中就不在存在了,是無法(難以)被恢復的。
邏輯刪除:
	邏輯刪除不是真正意義上的刪除,而是邏輯意義上的刪除。通常的實現方式是在數據表中添加一個字段,比如deleted(是否刪除,0未刪除,1已刪除)。
 	數據被邏輯刪除後在數據庫中依然是存在的,是可以(容易)被恢復的。
 	
適用於哪些場景:
	 物理刪除的場景: 數據不再有實際的意義。
	 邏輯刪除的場景: 數據的失效屬於狀態的改變,比如訂單作廢,用戶禁用,員工離職,文稿廢棄,優惠券作廢,商品下架等。

小知識【1】邏輯刪除和物理刪除的區別:
	//blog.csdn.net/qq_39288456/article/details/84786980

19、為什麼要使用swagger?

為什麼要使用swagger:
	隨着sprnigboot、springcloud等微服務的流行,在微服務的設計下,小公司微服務小的幾十,大公司大的幾百上萬的微服務。
	這麼多的微服務必定產生了大量的接口調用。而接口的調用就必定要寫接口文檔。
	在微服務的盛行下,成千上萬的接口文檔編寫,不可能靠人力來編寫,故swagger就產生了,它採用自動化實現並解決了人力編寫接口文檔的問題;

Swagger 提供了一個全新的維護 API 文檔的方式,有4大優點:
	1.自動生成文檔:只需要少量的註解,Swagger 就可以根據代碼自動生成 API 文檔,很好的保證了文檔的時效性。
	2.跨語言性,支持 40 多種語言。
	3.Swagger UI 呈現出來的是一份可交互式的 API 文檔,我們可以直接在文檔頁面嘗試 API 的調用,省去了準備複雜的調用參數的過程。
	4.還可以將文檔規範導入相關的工具(例如 SoapUI), 這些工具將會為我們自動地創建自動化測試。

20、使用springboot框架相較於之前的spring或者springmvc框架有哪些優勢?

springboot框架相較於之前的spring或者springmvc框架有哪些優勢:
	Spring Boot實現了自動配置,降低了項目搭建的複雜度。
	獨立運行的spring項目:
	內嵌Tomcat或Jetty等Servlet容器;
	無代碼生成和xml配置
	准生產的應用監控
	提供starter 簡化Maven 配置
	集成了常用的第三方庫配置
	
Spring Boot優點:
1、Spring Boot實現了自動配置,降低了項目搭建的複雜度。:
	眾所周知Spring框架需要進行大顯的配置,Spring Boot引入自動配置的概念,讓項目設置變得很容易。
自動配置 spring:Spring Boot 會根據在類路徑中的jar包,類,為jar包里的類自動配置Bean,這樣會極大減少我們要使用的配置。

2、獨立運行的spring項目:
	Spring Boot可以以jar包形式直接運行,如java-jar xxxjar優點是:節省服務器資源

3、內嵌Tomcat或Jetty等Servlet容器;:
	Spring Boot 可以選擇內嵌Tomcat,Jetty,這樣我們無須以war包形式部署項目。

4、無代碼生成和xml配置:
	Spring Boot大量使用spring4.x提供的註解新特性來實現無代碼生成和xml 配置。spring4.x提倡使用Java配置和註解配置組合
Spring Boot不需要任何xml配置即可實現spring的所有配置。

5、准生產的應用監控:
	Spring Boot 提供基於http,sh,telnet對運行時的項目進行監控

6、提供starter 簡化Maven 配置:
	在Spring Boot 項目中為我們提供了很多的spring-boot-starter-xxx的項目,我們導入指定的這些項目的坐標,就會自動導入和該模塊相關的依賴包:

7、集成了常用的第三方庫配置:
	集成了大星常用的第三方庫配置(例如Jackson,JDBC, Mongo, Redis, Mail等等),Spring Boot應用中這些第三方庫幾乎可以零配置的開箱即用,大部分的Spring Boot應用都只需要非常少量的配置代碼,開發者能夠更加專註於業務邏輯。

Tags:
Exit mobile version