1.Spring?Boot?是什么
成都創(chuàng)新互聯(lián)公司是一家集網(wǎng)站建設(shè),虹口企業(yè)網(wǎng)站建設(shè),虹口品牌網(wǎng)站建設(shè),網(wǎng)站定制,虹口網(wǎng)站建設(shè)報(bào)價(jià),網(wǎng)絡(luò)營(yíng)銷,網(wǎng)絡(luò)優(yōu)化,虹口網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競(jìng)爭(zhēng)力??沙浞譂M足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時(shí)我們時(shí)刻保持專業(yè)、時(shí)尚、前沿,時(shí)刻以成就客戶成長(zhǎng)自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
我們剛開(kāi)始學(xué)習(xí)?JavaWeb?的時(shí)候,使用?Servlet/JSP?做開(kāi)發(fā),一個(gè)接口搞一個(gè)?Servlet?,很頭大,后來(lái)我們通過(guò)隱藏域或者反射等方式,可以減少?Servlet?的創(chuàng)建,但是依然不方便。
再后來(lái),我們引入?Struts2/SpringMVC?這一類的框架,來(lái)簡(jiǎn)化我們的開(kāi)發(fā)?,和?Servlet/JSP?相比,引入框架之后,生產(chǎn)力確實(shí)提高了不少,但是用久了,又發(fā)現(xiàn)了新的問(wèn)題,即配置繁瑣易出錯(cuò),要做一個(gè)新項(xiàng)目,先搭建環(huán)境,環(huán)境搭建來(lái)搭建去,就是那幾行配置,不同的項(xiàng)目,可能就是包不同,其他大部分的配置都是一樣的。
Java?總是被人詬病配置繁瑣代碼量巨大,這就是其中一個(gè)表現(xiàn)。那么怎么辦?Spring?Boot?應(yīng)運(yùn)而生,Spring?Boot?是?Pivotal?團(tuán)隊(duì)在?2013?年開(kāi)始研發(fā)的一個(gè)基于?Spring?的全新框架,試圖將?Spring?中臃腫的配置進(jìn)行簡(jiǎn)化,使?Java?開(kāi)發(fā)更加輕量與快速,這個(gè)框架非?;钴S,官方也非常重視。
Spring?Boot?主要提供了如下功能:
為所有基于?Spring?的?Java?開(kāi)發(fā)提供方便快捷的入門體驗(yàn)。
開(kāi)箱即用,有自己自定義的配置就是用自己的,沒(méi)有就使用官方提供的默認(rèn)的。
提供了一系列通用的非功能性的功能,例如嵌入式服務(wù)器、安全管理、健康檢測(cè)等。
絕對(duì)沒(méi)有代碼生成,也不需要XML配置。
Spring?Boot?的出現(xiàn)讓?Java?開(kāi)發(fā)又回歸簡(jiǎn)單,因?yàn)榇_確實(shí)實(shí)解決了開(kāi)發(fā)中的痛點(diǎn),因此這個(gè)技術(shù)得到了非常廣泛的使用,大概從?2017?年年初開(kāi)始,Spring?Boot?基本上面試必問(wèn),現(xiàn)在流行的?Spring?Cloud?微服務(wù)也是基于?Spring?Boot,因此,所有的?Java?工程師都有必要掌握好?Spring?Boot。在此我向大家推薦一個(gè)架構(gòu)學(xué)習(xí)交流圈。交流學(xué)習(xí)偽鑫:1253431195(里面有大量的面試題及答案)里面會(huì)分享一些資深架構(gòu)師錄制的視頻錄像:有Spring,MyBatis,Netty源碼分析,高并發(fā)、高性能、分布式、微服務(wù)架構(gòu)的原理,JVM性能優(yōu)化、分布式架構(gòu)等這些成為架構(gòu)師必備的知識(shí)體系。還能領(lǐng)取免費(fèi)的學(xué)習(xí)資源,目前受益良多
從?Spring?Boot?誕生的過(guò)程中,我們可以看到:
Spring?Boot?并非另起爐灶,而是在現(xiàn)有的?Spring?框架的基礎(chǔ)上整出來(lái)的,它把?Spring?中繁瑣的配置進(jìn)行了簡(jiǎn)化。
Spring?Boot?降低了?Spring?家族的使用門檻,使新手更易上手?Spring?框架。
既然?Spring?Boot?不是另起爐灶,那么?Spring?Boot?學(xué)習(xí)要不要跳過(guò)?SSM?呢?聽(tīng)松哥來(lái)分析。
2.要不要跳過(guò)?SSM
這是很多人問(wèn)我的一個(gè)問(wèn)題,我的建議是:不要。
Spring?Boot?基于?Spring,簡(jiǎn)單且容易上手,很多人想當(dāng)然的跳過(guò)?SSM?直接上?Spring?Boot。但是當(dāng)我們細(xì)究?Spring?Boot?中的自動(dòng)化配置、條件注解、Java?配置等東西時(shí),實(shí)在找不出太多新鮮玩意,Java?配置是?Spring3?開(kāi)始提供的,條件注解?也是?Spring?中的東西,很多很多,都是?Spring?中就有的,只不過(guò)這些東西在?Spring?Boot?時(shí)代大放異彩。
也就是說(shuō),即使你跳過(guò)了?SSM?直接去學(xué)習(xí)?Spring?Boot,實(shí)際上還是在學(xué)習(xí)?Spring?中的東西,那既然這樣,我們還不如坐下來(lái),老老實(shí)實(shí)把?Spring?過(guò)一遍。
各個(gè)領(lǐng)域的開(kāi)發(fā)工程師其實(shí)都會(huì)面臨類似的問(wèn)題,學(xué)習(xí)了一些優(yōu)秀的封裝框架之后,還有沒(méi)有必要去學(xué)習(xí)底層?當(dāng)然有必要!因?yàn)榈讓拥臇|西可以讓你深刻的理解你目前用的這個(gè)東西,也能讓你在出問(wèn)題時(shí)快速解決掉問(wèn)題。
其實(shí)無(wú)論你想搞什么技術(shù),都要有牢固的基礎(chǔ)知識(shí),這些牢固的基礎(chǔ)知識(shí)就像肥沃的土壤,可以孕育出各種不同技術(shù)方向的牛人,基礎(chǔ)掌握好了,學(xué)什么框架都快。今天你跳過(guò)?SSM?直接學(xué)了?Spring?Boot,假如有一天?Spring?Boot?不行了,Pivotal?團(tuán)隊(duì)又基于?Spring?框架搞了一個(gè)新的框架出來(lái),那你是不是又要去學(xué)一遍?但是如果你一開(kāi)始就掌握了?Spring?的各種用法,無(wú)論基于它搞出來(lái)什么樣的框架,你都能快速上手。更進(jìn)一步,如果你研究透了?Spring?中的?AOP、Ioc/DI,你會(huì)發(fā)現(xiàn)很多框架大同小異,核心思想就是這些東西,那么你在學(xué)習(xí)?Spring?之外的框架,就會(huì)容易很多。
3.都要學(xué)哪些
那么?Spring?Boot?學(xué)習(xí)都要學(xué)哪些東西呢?我這里列舉了一個(gè)進(jìn)階路線:
最基礎(chǔ)的當(dāng)然是?Spring/SpringMVC?相關(guān)的東西了。
搭配各種頁(yè)面模版的使用,例如?Jsp/Thymeleaf/Freemarker/Groovy?Templates?等。
和各種?SQL?數(shù)據(jù)庫(kù)的整合,以及一些常見(jiàn)的數(shù)據(jù)持久化框架,例如?JdbcTemplate、MyBatis、Jpa?等。
和各種?NoSQL?數(shù)據(jù)庫(kù)的整合,例如?Redis、MongoDB、Elasticsearch?等。
搭配安全管理相關(guān)的知識(shí)點(diǎn),例如?Spring?Security、Shiro?等。
緩存的使用,例如?JCache、Ehcache?等。
和消息中間件的搭配整合,如?ActiveMQ、RabbitMQ、Kafka?等。
數(shù)據(jù)校驗(yàn)/定時(shí)任務(wù)/郵件發(fā)送等。
各種監(jiān)控的使用。
結(jié)合?WebSocket?的使用。
Spring?Cloud?中相關(guān)組件。
上面這些只是我列出來(lái)的一些比較常見(jiàn)的技術(shù)點(diǎn),每個(gè)技術(shù)點(diǎn)都還可以延伸出很多其他的東西,大家可以結(jié)合自己的情況,按照順序一個(gè)一個(gè)來(lái)學(xué),這里邊還涉及到很多第三方的框架,例如?Redis、MongoDB、RabbitMQ?等,Spring?Boot?的出現(xiàn)只是讓這些組件在和?Spring?家族的產(chǎn)品整合時(shí)變得更加方便,但是并不會(huì)簡(jiǎn)化這些組件原本的用法,所以,該學(xué)?Redis、該學(xué)?MongoDB、該學(xué)?RabbitMQ?等等,還是一個(gè)不能少。以?Redis?為例,學(xué)會(huì)了?Redis,學(xué)會(huì)了?Spring?整合?Redis,再回過(guò)頭來(lái)看?Spring?Boot?整合?Redis,那簡(jiǎn)直太?easy?了。
當(dāng)然,學(xué)習(xí)?Spring?Boot?最終我們還是奔著快速開(kāi)發(fā)和微服務(wù)去的,所以,像?Docker、Spring?Cloud?等技術(shù),也是需要去了解一下的。
4.怎么學(xué)
Spring?Boot?發(fā)展到今天,網(wǎng)上的資料和圖書現(xiàn)在是越來(lái)越多了。在看資料學(xué)習(xí)的同時(shí),大家也要留意以下幾個(gè)點(diǎn):
多看源碼。不同于其他全新的框架源碼你可能會(huì)看懵了,由于?Spring?Boot?是基于?Spring?的,所以只要你?Spring?基礎(chǔ)扎實(shí),看?Spring?Boot?源碼可以說(shuō)是毫無(wú)壓力。如果看?Spring?Boot?源碼覺(jué)得有壓力,那可能你?Spring?基礎(chǔ)不牢靠,這個(gè)時(shí)候不妨放下?Spring?Boot,去復(fù)習(xí)下?Spring。
每當(dāng)學(xué)會(huì)?Spring?Boot?中的一個(gè)知識(shí)點(diǎn),不妨想想這個(gè)功能在?Spring?框架中要如何使用,如何配置,兩邊都搞懂了,互相印證,加深對(duì)一個(gè)知識(shí)點(diǎn)的理解。
多多關(guān)注?Spring?Boot?的發(fā)展動(dòng)態(tài)。不同于傳統(tǒng)的框架可能一年更新一兩次,Spring?Boot?更新非常頻繁,二次每次更新都會(huì)帶來(lái)一些好玩的東西,可能會(huì)有新的?API?加入進(jìn)來(lái),也可能會(huì)有舊的?API?失效,變化大,因此多多關(guān)注,避免掉坑。
最后,我這里給大家列舉幾個(gè)我自己經(jīng)常關(guān)注的幾個(gè)資源。
4.1?官方文檔
老實(shí)說(shuō),Spring?Boot?的官方文檔是我接觸的所有官方文檔中最條理清晰淺顯易懂的,大家做開(kāi)發(fā),多多少少都接觸過(guò)一些第三方的開(kāi)放平臺(tái),很多平臺(tái)的文檔真是讓人忍不住想吐槽,框架都做出來(lái)了,認(rèn)認(rèn)真真寫個(gè)文檔有那么難么?
不過(guò)?Spring?Boot?的官方文檔可以算是非常非常友好了。雖然是英文的,但是實(shí)際上對(duì)英文要求并不高,連讀帶猜,其實(shí)很容易明白它的含義,我一般對(duì)?Spring?Boot?中某個(gè)知識(shí)點(diǎn)有疑問(wèn)的時(shí)候,都是首選官方文檔,當(dāng)然,如果你嫌官方文檔打開(kāi)慢,也幫你下載好了最新版的?pdf。
Spring Boot 是 Spring 開(kāi)源組織下的子項(xiàng)目,是 Spring 組件一站式解決方案,主要是簡(jiǎn)化了使用 Spring 的難度,簡(jiǎn)省了繁重的配置,提供了各種啟動(dòng)器,開(kāi)發(fā)者能快速上手。
Spring Boot 主要有如下優(yōu)點(diǎn):
啟動(dòng)類上面的注解是@SpringBootApplication,它也是 Spring Boot 的核心注解,主要組合包含了以下 3 個(gè)注解:
@SpringBootConfiguration:組合了 @Configuration 注解,實(shí)現(xiàn)配置文件的功能。
@EnableAutoConfiguration:打開(kāi)自動(dòng)配置的功能,也可以關(guān)閉某個(gè)自動(dòng)配置的選項(xiàng),如關(guān)閉數(shù)據(jù)源自動(dòng)配置功能:
@SpringBootApplication(exclude= { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring組件掃描。
Spring JavaConfig 是 Spring 社區(qū)的產(chǎn)品,它提供了配置 Spring IoC 容器的純Java 方法。因此它有助于避免使用 XML 配置。使用 JavaConfig 的優(yōu)點(diǎn)在于:
(1) 面向?qū)ο蟮呐渲?。由于配置被定義為 JavaConfig 中的類,因此用戶可以
充分利用 Java 中的面向?qū)ο蟮墓δ?。一個(gè)配置類可以繼承另一個(gè),重寫它的
@Bean 方法等。
(2) 減少或消除 XML 配置?;谝蕾囎⑷朐瓌t的外化配置的好處已被證明。
但是,許多開(kāi)發(fā)人員不希望在 XML 和 Java 之間來(lái)回切換。JavaConfig 為開(kāi)發(fā)人員提供了一種純粹 Java 方法來(lái)配置與 XML 配置概念相似的 Spring 容器。從
技術(shù)角度來(lái)講,只是使用 JavaConfig 配置類來(lái)配置容器是可行的,但實(shí)際上很多人認(rèn)為將JavaConfig 與 XML 混合匹配是理想的。(3)類型安全和重構(gòu)友好。JavaConfig 提供了一種類型安全的方法來(lái)配置
Spring容器。由于 Java 5.0 對(duì)泛型的支持,現(xiàn)在可以按類型而不是按名稱檢索 bean,不需要任何強(qiáng)制轉(zhuǎn)換或基于字符串的查找。
BFPP:BeanFactoryPostProcessor
BPP:BeanPostProcessor
BDRPP:BeanDefinitionRegistryPostProcessor
表達(dá)的總體思路是:總-分-總
1、springboot自動(dòng)裝配是什么,解決了什么問(wèn)題
2、自動(dòng)裝配實(shí)現(xiàn)的原理:
1、當(dāng)啟動(dòng)springboot應(yīng)用程序的時(shí)候, 會(huì)先創(chuàng)建SpringApplication的對(duì)象,在對(duì)象的構(gòu)造方法中會(huì)進(jìn)行某些參數(shù)的初始化工作,最主要的是判斷當(dāng)前應(yīng)用程序的類型以及初始化器和監(jiān)聽(tīng)器,在這個(gè)過(guò)程中會(huì)加載整個(gè)應(yīng)用程序中的spring.factories文件,將文件的內(nèi)容放到緩存對(duì)象中,方便后續(xù)獲取。
2、SpringApplication對(duì)象創(chuàng)建完成之后,開(kāi)始執(zhí)行run方法,來(lái)完成整個(gè)啟動(dòng),啟動(dòng)過(guò)程中最主要的有兩個(gè)方法,第一個(gè)叫做prepareContext,第二個(gè)叫做refreshContext,在這兩個(gè)關(guān)鍵步驟中完整了自動(dòng)裝配的核心功能,前面的處理邏輯包含了上下文對(duì)象的創(chuàng)建,banner的打印,異常報(bào)告期的準(zhǔn)備等各個(gè)準(zhǔn)備工作,方便后續(xù)來(lái)進(jìn)行調(diào)用。
3、在prepareContext方法中主要完成的是對(duì)上下文對(duì)象的初始化操作,包括了屬性值的設(shè)置,比如環(huán)境對(duì)象,在整個(gè)過(guò)程中有一個(gè)非常重要的方法,叫做load,load主要完成一件事,將當(dāng)前啟動(dòng)類做為一個(gè)beanDefinition注冊(cè)到registry中,方便后續(xù)在進(jìn)行BeanFactoryPostProcessor調(diào)用執(zhí)行的時(shí)候,找到對(duì)應(yīng)的主類,來(lái)完成@SpringBootApplicaiton,@EnableAutoConfiguration等注解的解析工作
4、在refreshContext方法中會(huì)進(jìn)行整個(gè)容器刷新過(guò)程,會(huì)調(diào)用中spring中的refresh方法,refresh中有13個(gè)非常關(guān)鍵的方法,來(lái)完成整個(gè)spring應(yīng)用程序的啟動(dòng),在自動(dòng)裝配過(guò)程中,會(huì)調(diào)用invokeBeanFactoryPostProcessor方法,在此方法中主要是對(duì)ConfigurationClassPostProcessor類的處理,這次是BFPP的子類也是BDRPP的子類,在調(diào)用的時(shí)候會(huì)先調(diào)用BDRPP中的postProcessBeanDefinitionRegistry方法,然后調(diào)用postProcessBeanFactory方法,在執(zhí)行postProcessBeanDefinitionRegistry的時(shí)候回解析處理各種注解,包含@PropertySource,@ComponentScan,@ComponentScans,@Bean,@Import等注解,最主要的是@Import注解的解析。
5、在解析@Import注解的時(shí)候,會(huì)有一個(gè)getImports的方法,從主類開(kāi)始遞歸解析注解,把所有包含@Import的注解都解析到,然后在processImport方法中對(duì)Import的類進(jìn)行分類,此處主要識(shí)別的時(shí)候AutoConfigurationImportSelect歸屬于ImportSelect的子類,在后續(xù)過(guò)程中會(huì)調(diào)用deferredImportSelectorHandler中的process方法,來(lái)完整EnableAutoConfiguration的加載。
6、上面是我對(duì)springboot自動(dòng)裝配的簡(jiǎn)單理解,面試官您看一下,我回答有沒(méi)有問(wèn)題,幫我指點(diǎn)一下!
在 Spring Boot 里面,可以使用以下幾種方式來(lái)加載配置。
1) properties文件;
2) YAML文件;
3) 系統(tǒng)環(huán)境變量;
等等……
YAML 是一種人類可讀的數(shù)據(jù)序列化語(yǔ)言。它通常用于配置文件。與屬性文件相比,如果我們想要在配置文件中添加復(fù)雜的屬性,YAML 文件就更加結(jié)構(gòu)化,而且更少混淆。可以看出 YAML 具有分層配置數(shù)據(jù)。
YAML 現(xiàn)在可以算是非常流行的一種配置文件格式了,無(wú)論是前端還是后端,都可以見(jiàn)到 YAML 配置。那么 YAML 配置和傳統(tǒng)的 properties 配置相比到底有哪些優(yōu)勢(shì)呢?
相比 properties 配置文件,YAML 還有一個(gè)缺點(diǎn),就是不支持 @PropertySource 注解導(dǎo)入自定義的 YAML 配置。
Spring Boot 推薦使用 Java 配置而非 XML 配置,但是 Spring Boot 中也可以使用 XML 配置,通過(guò) @ImportResource 注解可以引入一個(gè) XML 配置。 spring boot 核心配置文件是什么?
bootstrap.properties 和 application.properties 有何區(qū)別 ?
單純做 Spring Boot 開(kāi)發(fā),可能不太容易遇到 bootstrap.properties 配置文
件,但是在結(jié)合 Spring Cloud 時(shí),這個(gè)配置就會(huì)經(jīng)常遇到了,特別是在需要加載一些遠(yuǎn)程配置文件的時(shí)侯。
spring boot 核心的兩個(gè)配置文件:
bootstrap (. yml 或者 . properties):boostrap 由父 ApplicationContext 加載的,比 applicaton 優(yōu)先加載,配置在應(yīng)用程序上下文的引導(dǎo)階段生效。一般來(lái)說(shuō)我們?cè)?Spring Cloud Config 或者 Nacos 中會(huì)用到它。且 boostrap 里面的屬性不
能被覆蓋;
application (. yml 或者 . properties): 由ApplicatonContext 加載,用于 spring boot 項(xiàng)目的自動(dòng)化配置。
Spring Profiles 允許用戶根據(jù)配置文件(dev,test,prod 等)來(lái)注冊(cè) bean。因此,當(dāng)應(yīng)用程序在開(kāi)發(fā)中運(yùn)行時(shí),只有某些 bean 可以加載,而在
PRODUCTION中,某些其他 bean 可以加載。假設(shè)我們的要求是 Swagger 文檔僅適用于 QA 環(huán)境,并且禁用所有其他文檔。這可以使用配置文件來(lái)完成。Spring Boot 使得使用配置文件非常簡(jiǎn)單。
為了在自定義端口上運(yùn)行 Spring Boot 應(yīng)用程序,您可以在
application.properties 中指定端口。server.port = 8090
為了實(shí)現(xiàn) Spring Boot 的安全性,我們使用 spring-boot-starter-security 依賴項(xiàng),并且必須添加安全配置。它只需要很少的代碼。配置類將必須擴(kuò)展
WebSecurityConfigurerAdapter 并覆蓋其方法。
跨域可以在前端通過(guò) JSONP 來(lái)解決,但是 JSONP 只可以發(fā)送 GET 請(qǐng)求,無(wú)法發(fā)送其他類型的請(qǐng)求,在 RESTful 風(fēng)格的應(yīng)用中,就顯得非常雞肋,因此我們推薦在后端通過(guò) (CORS,Cross-origin resource sharing) 來(lái)解決跨域問(wèn)題。這種解決方案并非 Spring Boot 特有的,在傳統(tǒng)的 SSM 框架中,就可以通過(guò) CORS 來(lái)解決跨域問(wèn)題,只不過(guò)之前我們是在 XML 文件中配置 CORS ,現(xiàn)在可以通過(guò)實(shí)現(xiàn)WebMvcConfigurer接口然后重寫addCorsMappings方法解決跨域問(wèn)題。
項(xiàng)目中前后端分離部署,所以需要解決跨域的問(wèn)題。
我們使用cookie存放用戶登錄的信息,在spring攔截器進(jìn)行權(quán)限控制,當(dāng)權(quán)限不符合時(shí),直接返回給用戶固定的json結(jié)果。
當(dāng)用戶登錄以后,正常使用;當(dāng)用戶退出登錄狀態(tài)時(shí)或者token過(guò)期時(shí),由于攔截器和跨域的順序有問(wèn)題,出現(xiàn)了跨域的現(xiàn)象。
我們知道一個(gè)http請(qǐng)求,先走filter,到達(dá)servlet后才進(jìn)行攔截器的處理,如果我們把cors放在filter里,就可以優(yōu)先于權(quán)限攔截器執(zhí)行。
CSRF 代表跨站請(qǐng)求偽造。這是一種攻擊,迫使 終用戶在當(dāng)前通過(guò)身份驗(yàn)證的 Web 應(yīng)用程序上執(zhí)行不需要的操作。CSRF 攻擊專門針對(duì)狀態(tài)改變請(qǐng)求,而不是數(shù)據(jù)竊取,因?yàn)楣粽邿o(wú)法查看對(duì)偽造請(qǐng)求的響應(yīng)。
Spring boot actuator 是 spring 啟動(dòng)框架中的重要功能之一。Spring boot 監(jiān)視器可幫助您訪問(wèn)生產(chǎn)環(huán)境中正在運(yùn)行的應(yīng)用程序的當(dāng)前狀態(tài)。有幾個(gè)指標(biāo)必須在生產(chǎn)環(huán)境中進(jìn)行檢查和監(jiān)控。即使一些外部應(yīng)用程序可能正在使用這些服務(wù)來(lái)向相關(guān)人員觸發(fā)警報(bào)消息。監(jiān)視器模塊公開(kāi)了一組可直接作為 HTTP URL 訪問(wèn) 的REST 端點(diǎn)來(lái)檢查狀態(tài)。
如何在 Spring Boot 中禁用 Actuator 端點(diǎn)安全性?
默認(rèn)情況下,所有敏感的 HTTP 端點(diǎn)都是安全的,只有具有 ACTUATOR 角色
的用戶才能訪問(wèn)它們。安全性是使用標(biāo)準(zhǔn)的 HttpServletRequest.isUserInRole 方法實(shí)施的。 我們可以使用來(lái)禁用安全性。只有在執(zhí)行機(jī)構(gòu)端點(diǎn)在防火墻后訪問(wèn)時(shí),才建議禁用安全性。
Spring Boot 提供監(jiān)視器端點(diǎn)以監(jiān)控各個(gè)微服務(wù)的度量。這些端點(diǎn)對(duì)于獲取有關(guān)應(yīng)用程序的信息(如它們是否已啟動(dòng))以及它們的組件(如數(shù)據(jù)庫(kù)等)是否正常運(yùn)行很有幫助。但是,使用監(jiān)視器的一個(gè)主要缺點(diǎn)或困難是,我們必須單獨(dú)打開(kāi)應(yīng)用程序的知識(shí)點(diǎn)以了解其狀態(tài)或 健康 狀況。想象一下涉及 50 個(gè)應(yīng)用程序的微服務(wù),管理員將不得不擊中所有 50 個(gè)應(yīng)用程序的執(zhí)行終端。為了幫助我們處理這種情況,我們將使用位于的開(kāi)源項(xiàng)目。 它建立在 Spring Boot Actuator 之上,它提供了一個(gè) Web UI,使我們能夠可視化多個(gè)應(yīng)用程序的度量。
WebSocket 是一種計(jì)算機(jī)通信協(xié)議,通過(guò)單個(gè) TCP 連接提供全雙工通信信道。
1、 WebSocket 是雙向的 -使用 WebSocket 客戶端或服務(wù)器可以發(fā)起消息發(fā)送。
2、 WebSocket 是全雙工的 -客戶端和服務(wù)器通信是相互獨(dú)立的。
3、 單個(gè) TCP 連接 -初始連接使用 HTTP,然后將此連接升級(jí)到基于套接字的連接。然后這個(gè)單一連接用于所有未來(lái)的通信
4、 Light -與 http 相比,WebSocket 消息數(shù)據(jù)交換要輕得多。
什么是 Spring Data ?
Spring Data 是 Spring 的一個(gè)子項(xiàng)目。用于簡(jiǎn)化數(shù)據(jù)庫(kù)訪問(wèn),支持NoSQL 和 關(guān)系數(shù)據(jù)存儲(chǔ)。其主要目標(biāo)是使數(shù)據(jù)庫(kù)的訪問(wèn)變得方便快捷。Spring Data 具有如下特點(diǎn):
SpringData 項(xiàng)目支持 NoSQL 存儲(chǔ):
SpringData 項(xiàng)目所支持的關(guān)系數(shù)據(jù)存儲(chǔ)技術(shù):
Spring Boot Batch 提供可重用的函數(shù),這些函數(shù)在處理大量記錄時(shí)非常重要,包括日志/跟蹤,事務(wù)管理,作業(yè)處理統(tǒng)計(jì)信息,作業(yè)重新啟動(dòng),跳過(guò)和資源管理。它還提供了更先進(jìn)的技術(shù)服務(wù)和功能,通過(guò)優(yōu)化和分區(qū)技術(shù),可以實(shí)現(xiàn)極高批量和高性能批處理作業(yè)。簡(jiǎn)單以及復(fù)雜的大批量批處理作業(yè)可以高度可擴(kuò)展的方式利用框架處理重要大量的信息。
FreeMarker 是一個(gè)基于 Java 的模板引擎, 初專注于使用 MVC 軟件架構(gòu)進(jìn)行動(dòng)態(tài)網(wǎng)頁(yè)生成。使用 Freemarker 的主要優(yōu)點(diǎn)是表示層和業(yè)務(wù)層的完全分離。程序員可以處理應(yīng)用程序代碼,而設(shè)計(jì)人員可以處理 html 頁(yè)面設(shè)計(jì)。 后使用 freemarker 可以將這些結(jié)合起來(lái),給出 終的輸出頁(yè)面。
對(duì)于集成 Spring Boot 和 ActiveMQ,我們使用依賴關(guān)系。 它只需要很少的配置,并且不需要樣板代碼。
Swagger 廣泛用于可視化 API,使用 Swagger UI 為前端開(kāi)發(fā)人員提供在線沙箱。Swagger 是用于生成 RESTful Web 服務(wù)的可視化表示的工具,規(guī)范和完整框架實(shí)現(xiàn)。它使文檔能夠以與服務(wù)器相同的速度更新。當(dāng)通過(guò) Swagger 正確定義時(shí),消費(fèi)者可以使用 少量的實(shí)現(xiàn)邏輯來(lái)理解遠(yuǎn)程服務(wù)并與其進(jìn)行交互。因此,Swagger消除了調(diào)用服務(wù)時(shí)的猜測(cè)。
前后端分離,如何維護(hù)接口文檔 ?
前后端分離開(kāi)發(fā)日益流行,大部分情況下,我們都是通過(guò) Spring Boot 做前后端分離開(kāi)發(fā),前后端分離一定會(huì)有接口文檔,不然會(huì)前后端會(huì)深深陷入到扯皮中。一個(gè)比較笨的方法就是使用 word 或者 md 來(lái)維護(hù)接口文檔,但是效率太低,接口一變,所有人手上的文檔都得變。在 Spring Boot 中,這個(gè)問(wèn)題常見(jiàn)
的解決方案是 Swagger ,使用 Swagger 我們可以快速生成一個(gè)接口文檔網(wǎng)
站,接口一旦發(fā)生變化,文檔就會(huì)自動(dòng)更新,所有開(kāi)發(fā)工程師訪問(wèn)這一個(gè)在線網(wǎng)站就可以獲取到 新的接口文檔,非常方便。
這可以使用 DEV 工具來(lái)實(shí)現(xiàn)。通過(guò)這種依賴關(guān)系,您可以節(jié)省任何更改,嵌入式tomcat 將重新啟動(dòng)。Spring Boot 有一個(gè)開(kāi)發(fā)工具(DevTools)模塊,它有助于提高開(kāi)發(fā)人員的生產(chǎn)力。Java 開(kāi)發(fā)人員面臨的一個(gè)主要挑戰(zhàn)是將文件更改自動(dòng)部署到服務(wù)器并自動(dòng)重啟服務(wù)器。開(kāi)發(fā)人員可以重新加載 Spring Boot 上的更改,而無(wú)需重新啟動(dòng)服務(wù)器。這將消除每次手動(dòng)部署更改的需要。
Spring Boot 在發(fā)布它的第一個(gè)版本時(shí)沒(méi)有這個(gè)功能。這是開(kāi)發(fā)人員 需要的功能。DevTools 模塊完全滿足開(kāi)發(fā)人員的需求。該模塊將在生產(chǎn)環(huán)境中被禁用。
它還提供 H2 數(shù)據(jù)庫(kù)控制臺(tái)以更好地測(cè)試應(yīng)用程序。
使用了下面的一些依賴項(xiàng)
spring-boot-starter-activemq
spring-boot-starter-security
這有助于增加更少的依賴關(guān)系,并減少版本的沖突。
Spring Boot 中的 starter 到底是什么 ?
首先,這個(gè) Starter 并非什么新的技術(shù)點(diǎn),基本上還是基于 Spring 已有功能來(lái)實(shí)現(xiàn)的。首先它提供了一個(gè)自動(dòng)化配置類,一般命名為 XXXAutoConfiguration
,在這個(gè)配置類中通過(guò)條件注解來(lái)決定一個(gè)配置是否生效(條件注解就是
Spring 中原本就有的),然后它還會(huì)提供一系列的默認(rèn)配置,也允許開(kāi)發(fā)者根據(jù)實(shí)際情況自定義相關(guān)配置,然后通過(guò)類型安全的屬性注入將這些配置屬性注入進(jìn)來(lái),新注入的屬性會(huì)代替掉默認(rèn)屬性。正因?yàn)槿绱?,很多第三方框架,我們只需要引入依賴就可以直接使用了。?dāng)然,開(kāi)發(fā)者也可以自定義 Starter spring-boot-starter-parent 有什么用 ?
我們都知道,新創(chuàng)建一個(gè) Spring Boot 項(xiàng)目,默認(rèn)都是有 parent 的,這個(gè)
parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有如下作用:
Spring Boot 打成的 jar 和普通的 jar 有什么區(qū)別 ?
Spring Boot 項(xiàng)目 終打包成的 jar 是可執(zhí)行 jar ,這種 jar 可以直接通過(guò) java jar xxx.jar 命令來(lái)運(yùn)行,這種 jar 不可以作為普通的 jar 被其他項(xiàng)目依賴,即使依賴了也無(wú)法使用其中的類。
Spring Boot 的 jar 無(wú)法被其他項(xiàng)目依賴,主要還是他和普通 jar 的結(jié)構(gòu)不同。普通的 jar 包,解壓后直接就是包名,包里就是我們的代碼,而 Spring Boot
打包成的可執(zhí)行 jar 解壓后,在 BOOT-INFclasses 目錄下才是我們的代碼,因此無(wú)法被直接引用。如果非要引用,可以在 pom.xml 文件中增加配置,將 Spring Boot 項(xiàng)目打包成兩個(gè) jar ,一個(gè)可執(zhí)行,一個(gè)可引用。
1) 打包用命令或者放到容器中運(yùn)行
2) 用 Maven/ Gradle 插件運(yùn)行
3)直接執(zhí)行 main 方法運(yùn)行
1) 繼承spring-boot-starter-parent項(xiàng)目
2) 導(dǎo)入spring-boot-dependencies項(xiàng)目依賴
Spring 提供了一種使用 ControllerAdvice 處理異常的非常有用的方法。 我們通過(guò)實(shí)現(xiàn)一個(gè) ControlerAdvice 類,來(lái)處理控制器類拋出的所有異常。
使用 Spring Boot 實(shí)現(xiàn)分頁(yè)非常簡(jiǎn)單。使用 Spring Data-JPA 可以實(shí)現(xiàn)將可分頁(yè)的傳遞給存儲(chǔ)庫(kù)方法。
微服務(wù)中如何實(shí)現(xiàn) session 共享 ?
在微服務(wù)中,一個(gè)完整的項(xiàng)目被拆分成多個(gè)不相同的獨(dú)立的服務(wù),各個(gè)服務(wù)獨(dú)立部署在不同的服務(wù)器上,各自的 session 被從物理空間上隔離開(kāi)了,但是經(jīng)
常,我們需要在不同微服務(wù)之間共享 session ,常見(jiàn)的方案就是 Spring
Session + Redis 來(lái)實(shí)現(xiàn) session 共享。將所有微服務(wù)的 session 統(tǒng)一保存在 Redis 上,當(dāng)各個(gè)微服務(wù)對(duì) session 有相關(guān)的讀寫操作時(shí),都去操作 Redis 上的 session 。這樣就實(shí)現(xiàn)了 session 共享,Spring Session 基于 Spring 中的代理過(guò)濾器實(shí)現(xiàn),使得 session 的同步操作對(duì)開(kāi)發(fā)人員而言是透明的,非常簡(jiǎn)便。
定時(shí)任務(wù)也是一個(gè)常見(jiàn)的需求,Spring Boot 中對(duì)于定時(shí)任務(wù)的支持主要還是來(lái)自 Spring 框架。
在 Spring Boot 中使用定時(shí)任務(wù)主要有兩種不同的方式,一個(gè)就是使用 Spring 中的 @Scheduled 注解,另一個(gè)則是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要通過(guò) @Scheduled 注解來(lái)實(shí)現(xiàn)。
使用 Quartz ,則按照 Quartz 的方式,定義 Job 和 Trigger 即可。
如果說(shuō)與數(shù)據(jù)庫(kù)打交道的意義上講,JDBC是最基礎(chǔ)的,mybatis等框架主鍵也是基于此。另外springJBA Data是什么鬼,是Spring Data JPA 吧,JPA全稱為Java持久性API(Java Persistence API),JPA是Java EE 5標(biāo)準(zhǔn)之一。
從應(yīng)用的角度來(lái)看,直接使用JDBC寫代碼連接數(shù)據(jù)庫(kù)已經(jīng)很少了,除了一些小項(xiàng)目;mybatis可以自動(dòng)生成dao和daoImpl以及配置文件,可以修改sql語(yǔ)句,使用較為靈活;
為了簡(jiǎn)化程序與數(shù)據(jù)庫(kù)交互的代碼,spring提供了一個(gè)現(xiàn)成的dao層框架,spring家族提供的spring-data適用于關(guān)系型數(shù)據(jù)庫(kù)和nosql數(shù)據(jù)庫(kù) ,雖然使用起來(lái)很方便,但其簡(jiǎn)化了SQL功能如查詢所有數(shù)據(jù) findAll(),但復(fù)雜查詢就有些麻煩了;
簡(jiǎn)而言之,Spring是企業(yè)級(jí)Java的開(kāi)源開(kāi)發(fā)框架。Spring框架的核心功能可用于開(kāi)發(fā)任何java應(yīng)用程序。Spring框架的核心模塊如下:
任何由 Spring IoC 容器初始化的普通 Java 類都稱為 Spring Bean。我們使用 spring 應(yīng)用程序上下文來(lái)獲取 Spring Bean 實(shí)例。 Spring IoC Container 管理 Spring Bean 范圍/作用域的生命周期并在 bean 中注入任何所需的依賴項(xiàng)。
Spring bean的不同作用域:
對(duì)于任何 Java 應(yīng)用程序,都有兩個(gè)不同的作用域,稱為單例(Singleton)和原型(Prototype)
主要有三種不同的作用域(或范圍),即 請(qǐng)求(request)、會(huì)話(session)和全局會(huì)話(global-session) ,專門針對(duì)基于 Spring 的 Java Web 應(yīng)用程序。
Singleton 是任何 bean 的默認(rèn)作用域。這意味著每個(gè) IoC 容器將創(chuàng)建單個(gè) bean 實(shí)例。因此,單例 bean 不是線程安全的。
要設(shè)置 spring bean 的范圍,我們可以在 標(biāo)簽中使用scope屬性。 @scope 用于基于注釋的 DI。
Spring 容器是 Spring 框架的核心。容器將創(chuàng)建對(duì)象,把它們連接在一起,配置它們,并管理它們從創(chuàng)建到銷毀的完整生命周期。 Spring 容器使用依賴注入 (DI) 來(lái)管理組成應(yīng)用程序的組件。
有兩種不同類型的容器:
BeanFactory 容器 :這是 Spring 容器的核心。 org.springframework.beans.factory.BeanFactory 是一個(gè)接口,充當(dāng) IoC 容器,它實(shí)例化、配置和管理許多 bean。應(yīng)用示例如下:
ApplicationContext 容器 :org.springframework.context.ApplicationContext 接口也充當(dāng) IoC 容器,但 ApplicationContext 接口建立在 BeanFactory 接口之上,以提供一些BeanFactory 額外的功能,例如與 Spring 的 AOP 的簡(jiǎn)單集成、消息資源處理(對(duì)于 I18N )、事件傳播、Web 應(yīng)用程序的應(yīng)用層特定上下文(例如 WebApplicationContext)。所以使用 ApplicationContext 比使用 BeanFactory更好些。示例代碼如下:
對(duì)于基于注解的依賴注入,使用@Autowired 注解。標(biāo)有@Component/@Service/@Repository 等的類可以注入到標(biāo)有@Autowired 的屬性中
@Autowired 應(yīng)用于:
1)基于構(gòu)造器和setter的區(qū)別
2)context:annotation-config 和 context:component-scan 的區(qū)別
3)@Component、@Controller、@Repository @Service 注解的區(qū)別
如果一個(gè)類用@Component/@Controller/@Service/@Repository 注解標(biāo)記,那么Spring DI 容器可以在組件掃描機(jī)制期間識(shí)別該類。但是,對(duì)于服務(wù)層類使用@Service 是個(gè)好主意,并且@Controller 應(yīng)該在spring mvc web 控制器中使用。 @Repository 用于將 DAO 導(dǎo)入 DI 容器。此外,任何未經(jīng)檢查的異常都將被轉(zhuǎn)換為 Spring DataAccessException。
4)ViewResolver 與 MultipartResolver
ViewResolver 用于按名稱解析視圖。該接口由 InternalResourceViewResolver 實(shí)現(xiàn) ;
MultipartResolver 用于處理 web 應(yīng)用程序中的文件上傳。
5)Spring MVC 中的驗(yàn)證
org.springframework.validation.Validator 接口支持 spring MVC 驗(yàn)證。驗(yàn)證表單的一些實(shí)用方法是 ValidationUtils 類中的 rejectIfEmptyOrWhitespace() 和 rejectIfEmpty()。示例如下:
Spring MVC 中驗(yàn)證表單的另一種方法是:
HandlerInterceptor 接口充當(dāng) spring MVC 攔截器。它在服務(wù)請(qǐng)求之前和之后攔截。如果您實(shí)現(xiàn)了 HandlerInterceptor 接口,則 preHandle()、postHandle() 和 afterCompletion() 是要覆蓋的方法。但是,為了避免覆蓋,您可以使用 HandlerInterceptorAdapter 類。
實(shí)現(xiàn) ServletContextAware 和 ServletConfigAware 接口并覆蓋以下方法:
數(shù)據(jù)庫(kù)事務(wù)是一組被視為關(guān)聯(lián)工作單元的操作。事務(wù)的主要原則是提交所有操作或在失敗的情況下回滾所有操作。在交易中提交數(shù)據(jù)時(shí),我們需要確保交易協(xié)議/稱為 ACID(原子性-一致性-隔離-持久性)的屬性:
全局事務(wù) vs 本地事務(wù):
臟讀、幻讀和不可重復(fù)讀:
隔離與傳播:
在舊版本的 spring 和 hibernate 集成中,需要 HibernateDAOSupport 和 HibernateTemplate。但是,較新版本的 Spring 不建議使用這兩個(gè)類(這里僅做了解)。
通常我們從 HibernateDAOSupport 擴(kuò)展我們的 DAO 類,并且 getHibernateTemplate() 方法將可用于Hibernate會(huì)話中的 CRUD 操作。由于這不是推薦的方法,所以我們?cè)?DAO 中注入會(huì)話工廠(SessionFactory)。下面的代碼片段會(huì)給你一些關(guān)于 HibernateDAOSupport 和 HibernateTemplate 的想法:
DAO 是一種設(shè)計(jì)模式,以最大限度地減少應(yīng)用程序和后端之間的耦合;
ORM 處理如何將對(duì)象映射到對(duì)象關(guān)系數(shù)據(jù)庫(kù)中,從而減少數(shù)據(jù)庫(kù)和應(yīng)用程序之間的耦合。
如果您在沒(méi)有 DAO 的情況下使用 ORM,那么您的應(yīng)用程序?qū)⒆兊靡蕾囉?ORM,因此很難從一個(gè) ORM(例如Hibernate)移動(dòng)到另一個(gè) ORM(例如 NoSQL)。
Spring DAO 是使用@Repository 注解實(shí)現(xiàn)的。 Spring 存儲(chǔ)庫(kù)擴(kuò)展 JPARepository 并傳遞 JPA 實(shí)體及其主鍵。
最后,關(guān)于Spring框架相關(guān)的概念就簡(jiǎn)要介紹到這里,希望這能給你進(jìn)入并深入Spring技術(shù)棧一個(gè)簡(jiǎn)單入口,而不會(huì)被Spring技術(shù)生態(tài)所驚嚇(Spring現(xiàn)在都成軟件開(kāi)發(fā)技術(shù)的全家桶了,啥都有)——日進(jìn)一步,鍥而不舍,終將大成!