瘋狂創客圈 經典圖書 : 《Netty Zookeeper Redis 高併發實戰》 面試必備 + 面試必備 + 面試必備 【博客園總入口 】html
瘋狂創客圈 經典圖書 : 《SpringCloud、Nginx高併發核心編程》 大廠必備 + 大廠必備 + 大廠必備 【博客園總入口 】前端
入大廠+漲工資 必備的 高併發社羣: 【博客園總入口 】java
瘋狂創客圈 史上最強 面試題 系列 | |
---|---|
Java基礎 | |
死鎖面試題(史上最強、持續更新) | http://www.javashuo.com/article/p-uyudvdol-vd.html |
多線程、線程池、內置鎖 面試題 (史上最強、持續更新) | http://www.javashuo.com/article/p-tecubweb-vd.html |
JUC併發包與容器類 - 面試題(史上最強、持續更新) | http://www.javashuo.com/article/p-xcyjkbgi-vd.html |
SpringBoot - 面試題(史上最強、持續更新) | https://www.cnblogs.com/crazymakercircle/p/14365487.html |
分佈式高併發 | |
Zookeeper 面試題(史上最強、持續更新) | http://www.javashuo.com/article/p-fvxlillp-vd.html |
Mysql 面試題(史上最強、持續更新) | https://www.cnblogs.com/crazymakercircle/p/13900186.html |
Redis 面試題 - 收藏版(史上最強、持續更新) | https://www.cnblogs.com/crazymakercircle/p/13900198.html |
SpringCloud 面試題 - 收藏版(史上最強、持續更新) | https://www.cnblogs.com/crazymakercircle/p/13900212.html |
Netty 面試題 (史上最強、持續更新) | https://www.cnblogs.com/crazymakercircle/p/13903625.html |
Spring Boot 是 Spring 開源組織下的子項目,是 Spring 組件一站式解決方案,主要是簡化了使用 Spring 的難度,簡省了繁重的配置,提供了各類啓動器,開發者能快速上手。程序員
SpringFrameweb
SpringFramework 最重要的特徵是依賴注入。全部 SpringModules 不是依賴注入就是 IOC 控制反轉。面試
當咱們恰當的使用 DI 或者是 IOC 的時候,咱們能夠開發鬆耦合應用。鬆耦合應用的單元測試能夠很容易的進行。spring
SpringMVCsql
Spring MVC 提供了一種分離式的方法來開發 Web 應用。經過運用像 DispatcherServelet,MoudlAndView 和 ViewResolver 等一些簡單的概念,開發 Web 應用將會變的很是簡單。數據庫
SpringBootapache
Spring 和 SpringMVC 的問題在於:須要配置大量的參數。
<pre style="box-sizing: inherit; font-family: Menlo, Monaco, Consolas, "Courier New", monospace; font-size: 13px; word-break: initial; word-wrap: initial; white-space: pre; overflow: auto; margin: 16px 0px 14px; padding: 14px 15px 12px; border-radius: 3px; border: none; display: block; line-height: 1.6; background: rgb(246, 246, 246); color: rgb(61, 70, 77); font-style: normal; font-variant-ligatures: normal; font-variant-caps: normal; font-weight: 400; letter-spacing: normal; orphans: 2; text-align: start; text-indent: 0px; text-transform: none; widows: 2; word-spacing: 0px; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial;"><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix"> <value>/WEB-INF/views/</value> </property> <property name="suffix"> <value>.jsp</value> </property> </bean> <mvc:resources mapping="/webjars/**" location="/webjars/"/></pre>
Spring Boot 經過一個自動配置和啓動的項來目解決這個問題。爲了更快的構建產品就緒應用程序,Spring Boot 提供了一些非功能性特徵。
Spring Boot 主要有以下優勢:
爲了解決java開發中的,繁多的配置、底下的開發效率,複雜的部署流程,和第三方技術集成難度大的問題,產生了spring boot。
springboot 使用 「習慣優於配置」的理念讓項目快速運行起來,使用springboot很容易建立一個獨立運行的jar,內嵌servlet容器
springboot的核心功能一:獨立運行spring項目,springboot能夠以jar包的形式獨立運行,運行一個springboot項目只須要 java -jar xxx.jar 來運行
springboot的核心功能二:內嵌servlet容器,能夠內嵌tomcat,接天jetty,或者undertow,這樣咱們就能夠不用war包形式部署項目
springboot的核心功能三,提供starter簡化maven配置,spring提供了一系列starter pom 來簡化maven的依賴加載, 當使用了 spring-boot-starter-web時,會自動加載所須要的依賴包
springboot的核心功能三:自動配置spring sprintboot 會根據在類路徑的jar包,類,爲jar包中的類自動配置bean,這樣會極大的減小使用的配置,會根據啓動類所在的目錄,自動配置bean
啓動器是一套方便的依賴沒描述符,它能夠放在本身的程序中。你能夠一站式的獲取你所須要的 Spring 和相關技術,而不須要依賴描述符的經過示例代碼搜索和複製黏貼的負載。
例如,若是你想使用 Sping 和 JPA 訪問數據庫,只須要你的項目包含 spring-boot-starter-data-jpa 依賴項,你就能夠完美進行。
Spring Boot 也提供了其它的啓動器項目包括,包括用於開發特定類型應用程序的典型依賴項。
spring-boot-starter-web-services - SOAP Web Services
spring-boot-starter-web - Web 和 RESTful 應用程序
spring-boot-starter-test - 單元測試和集成測試
spring-boot-starter-jdbc - 傳統的 JDBC
spring-boot-starter-hateoas - 爲服務添加 HATEOAS 功能
spring-boot-starter-security - 使用 SpringSecurity 進行身份驗證和受權
spring-boot-starter-data-jpa - 帶有 Hibeernate 的 Spring Data JPA
spring-boot-starter-data-rest - 使用 Spring Data REST 公佈簡單的 REST 服務
Spring Boot 致力於快速產品就緒應用程序。爲此,它提供了一些譬如高速緩存,日誌記錄,監控和嵌入式服務器等開箱即用的非功能性特徵。
spring-boot-starter-actuator - 使用一些如監控和跟蹤應用的高級功能
spring-boot-starter-undertow, spring-boot-starter-jetty, spring-boot-starter-tomcat - 選擇您的特定嵌入式 Servlet 容器
spring-boot-starter-logging - 使用 logback 進行日誌記錄
spring-boot-starter-cache - 啓用 Spring Framework 的緩存支持
Spring Boot 2.0 須要 Java8 或者更新的版本。Java6 和 Java7 已經再也不支持。
啓動類上面的註解是@SpringBootApplication,它也是 Spring Boot 的核心註解,主要組合包含了如下 3 個註解:
@SpringBootConfiguration:組合了 @Configuration 註解,實現配置文件的功能。
@EnableAutoConfiguration:打開自動配置的功能,也能夠關閉某個自動配置的選項,如關閉數據源自動配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring組件掃描。
Spring JavaConfig 是 Spring 社區的產品,它提供了配置 Spring IoC 容器的純Java 方法。所以它有助於避免使用 XML 配置。使用 JavaConfig 的優勢在於:
(1)面向對象的配置。因爲配置被定義爲 JavaConfig 中的類,所以用戶能夠充分利用 Java 中的面向對象功能。一個配置類能夠繼承另外一個,重寫它的@Bean 方法等。
(2)減小或消除 XML 配置。基於依賴注入原則的外化配置的好處已被證實。可是,許多開發人員不但願在 XML 和 Java 之間來回切換。JavaConfig 爲開發人員提供了一種純 Java 方法來配置與 XML 配置概念類似的 Spring 容器。從技術角度來說,只使用 JavaConfig 配置類來配置容器是可行的,但實際上不少人認爲將JavaConfig 與 XML 混合匹配是理想的。
(3)類型安全和重構友好。JavaConfig 提供了一種類型安全的方法來配置 Spring容器。因爲 Java 5.0 對泛型的支持,如今能夠按類型而不是按名稱檢索 bean,不須要任何強制轉換或基於字符串的查找。
註解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自動配置的核心,
@EnableAutoConfiguration 給容器導入META-INF/spring.factories 裏定義的自動配置類。
篩選有效的自動配置類。
每個自動配置類結合對應的 xxxProperties.java 讀取配置文件進行自動配置功能
在 Spring Boot 裏面,可使用如下幾種方式來加載配置。
1)properties文件;
2)YAML文件;
3)系統環境變量;
4)命令行參數;
等等……
咱們能夠在 Spring Beans 裏面直接使用這些配置文件中加載的值,如:
一、使用 @Value 註解直接注入對應的值,這能獲取到 Spring 中 Environment 的值;
二、使用 @ConfigurationProperties 註解把對應的值綁定到一個對象;
三、直接獲取注入 Environment 進行獲取;
配置屬性的方式不少,Spring boot使用了一種獨有的 PropertySource 能夠很方便的覆蓋屬性的值。
配置屬性加載的順序以下:
一、開發者工具 Devtools
全局配置參數;
二、單元測試上的 [@TestPropertySource](mailto:
@TestPropertySource)` 註解指定的參數;
三、單元測試上的 [@SpringBootTest](mailto:
@SpringBootTest)` 註解指定的參數;
四、命令行指定的參數,如 java -jar springboot.jar --name="Java技術棧"
;
五、命令行中的 SPRING_APPLICATION_JSONJSON
指定參數, 如 java -Dspring.application.json='{"name":"Java技術棧"}' -jar springboot.jar
六、ServletConfig
初始化參數;
七、ServletContext
初始化參數;
八、JNDI參數(如 java:comp/env/spring.application.json
);
九、Java系統參數(來源:System.getProperties()
);
十、操做系統環境變量參數;
十一、RandomValuePropertySource
隨機數,僅匹配:ramdom.*
;
十二、JAR包外面的配置文件參數(application-{profile}.properties(YAML)
)
1三、JAR包裏面的配置文件參數(application-{profile}.properties(YAML)
)
1四、JAR包外面的配置文件參數(application.properties(YAML)
)
1五、JAR包裏面的配置文件參數(application.properties(YAML)
)
1六、@Configuration](mailto:
@Configuration)配置文件上 [
@PropertySource` 註解加載的參數;
1七、默認參數(經過 SpringApplication.setDefaultProperties
指定);
數字小的優先級越高,即數字小的會覆蓋數字大的參數值,咱們來實踐下,驗證以上配置參數的加載順序。
YAML 是一種人類可讀的數據序列化語言。它一般用於配置文件。與屬性文件相比,若是咱們想要在配置文件中添加複雜的屬性,YAML 文件就更加結構化,並且更少混淆。能夠看出 YAML 具備分層配置數據。
YAML 如今能夠算是很是流行的一種配置文件格式了,不管是前端仍是後端,均可以見到 YAML 配置。那麼 YAML 配置和傳統的 properties 配置相比到底有哪些優點呢?
相比 properties 配置文件,YAML 還有一個缺點,就是不支持 @PropertySource 註解導入自定義的 YAML 配置。
Spring Boot 推薦使用 Java 配置而非 XML 配置,可是 Spring Boot 中也可使用 XML 配置,經過 @ImportResource 註解能夠引入一個 XML 配置。
eg:
@ImportResource({"classpath:some-context.xml","classpath:another-context.xml"})
單純作 Spring Boot 開發,可能不太容易遇到 bootstrap.properties 配置文件,可是在結合 Spring Cloud 時,這個配置就會常常遇到了,特別是在須要加載一些遠程配置文件的時侯。
spring boot 核心的兩個配置文件:
Spring Profiles 容許用戶根據不一樣配置文件(dev,test,prod 等)來註冊 bean。所以,當應用程序在開發中運行時,只有某些 bean 能夠加載,而在 PRODUCTION中,某些其餘 bean 能夠加載。假設咱們的要求是 Swagger 文檔僅適用於 QA 環境,而且禁用全部其餘文檔。這可使用配置文件來完成。
Spring Boot 使得使用配置文件很是簡單。
爲了在自定義端口上運行 Spring Boot 應用程序,您能夠在application.properties 中指定端口。
server.port = 8090
爲了實現 Spring Boot 的安全性,咱們使用 spring-boot-starter-security 依賴項,而且必須添加安全配置。它只須要不多的代碼。配置類將必須擴展WebSecurityConfigurerAdapter 並覆蓋其方法。
因爲 Spring Boot 官方提供了大量的很是方便的開箱即用的 Starter ,包括 Spring Security 的 Starter ,使得在 Spring Boot 中使用 Spring Security 變得更加容易,甚至只須要添加一個依賴就能夠保護全部的接口,因此,若是是 Spring Boot 項目,通常選擇 Spring Security 。固然這只是一個建議的組合,單純從技術上來講,不管怎麼組合,都是沒有問題的。Shiro 和 Spring Security 相比,主要有以下一些特色:
Spring Security 是一個重量級的安全管理框架;Shiro 則是一個輕量級的安全管理框架
Spring Security 概念複雜,配置繁瑣;Shiro 概念簡單、配置簡單
Spring Security 功能強大;Shiro 功能簡單
跨域能夠在前端經過 JSONP 來解決,可是 JSONP 只能夠發送 GET 請求,沒法發送其餘類型的請求,在 RESTful 風格的應用中,就顯得很是雞肋,所以咱們推薦在後端經過 (CORS,Cross-origin resource sharing) 來解決跨域問題。這種解決方案並不是 Spring Boot 特有的,在傳統的 SSM 框架中,就能夠經過 CORS 來解決跨域問題,只不過以前咱們是在 XML 文件中配置 CORS ,如今能夠經過實現WebMvcConfigurer接口而後重寫addCorsMappings方法解決跨域問題。
@Configuration public class CorsConfig implements WebMvcConfigurer { @Override public void addCorsMappings(CorsRegistry registry) { registry.addMapping("/**") .allowedOrigins("*") .allowCredentials(true) .allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS") .maxAge(3600); } } 12345678910111213
項目中先後端分離部署,因此須要解決跨域的問題。
咱們使用cookie存放用戶登陸的信息,在spring攔截器進行權限控制,當權限不符合時,直接返回給用戶固定的json結果。
當用戶登陸之後,正常使用;當用戶退出登陸狀態時或者token過時時,因爲攔截器和跨域的順序有問題,出現了跨域的現象。
咱們知道一個http請求,先走filter,到達servlet後才進行攔截器的處理,若是咱們把cors放在filter裏,就能夠優先於權限攔截器執行。
@Configuration public class CorsConfig { @Bean public CorsFilter corsFilter() { CorsConfiguration corsConfiguration = new CorsConfiguration(); corsConfiguration.addAllowedOrigin("*"); corsConfiguration.addAllowedHeader("*"); corsConfiguration.addAllowedMethod("*"); corsConfiguration.setAllowCredentials(true); UrlBasedCorsConfigurationSource urlBasedCorsConfigurationSource = new UrlBasedCorsConfigurationSource(); urlBasedCorsConfigurationSource.registerCorsConfiguration("/**", corsConfiguration); return new CorsFilter(urlBasedCorsConfigurationSource); } } 12345678910111213141516
CSRF 表明跨站請求僞造。這是一種攻擊,迫使最終用戶在當前經過身份驗證的Web 應用程序上執行不須要的操做。CSRF 攻擊專門針對狀態改變請求,而不是數據竊取,由於攻擊者沒法查看對僞造請求的響應。
Spring boot actuator 是 spring 啓動框架中的重要功能之一。Spring boot 監視器可幫助您訪問生產環境中正在運行的應用程序的當前狀態。有幾個指標必須在生產環境中進行檢查和監控。即便一些外部應用程序可能正在使用這些服務來向相關人員觸發警報消息。監視器模塊公開了一組可直接做爲 HTTP URL 訪問的REST 端點來檢查狀態。
默認狀況下,全部敏感的 HTTP 端點都是安全的,只有具備 ACTUATOR 角色的用戶才能訪問它們。安全性是使用標準的 HttpServletRequest.isUserInRole 方法實施的。 咱們可使用來禁用安全性。只有在執行機構端點在防火牆後訪問時,才建議禁用安全性。
Spring Boot 提供監視器端點以監控各個微服務的度量。這些端點對於獲取有關應用程序的信息(如它們是否已啓動)以及它們的組件(如數據庫等)是否正常運行頗有幫助。可是,使用監視器的一個主要缺點或困難是,咱們必須單獨打開應用程序的知識點以瞭解其狀態或健康情況。想象一下涉及 50 個應用程序的微服務,管理員將不得不擊中全部 50 個應用程序的執行終端。爲了幫助咱們處理這種狀況,咱們將使用位於的開源項目。 它創建在 Spring Boot Actuator 之上,它提供了一個 Web UI,使咱們可以可視化多個應用程序的度量。
先後端分離開發日益流行,大部分狀況下,咱們都是經過 Spring Boot 作先後端分離開發,先後端分離必定會有接口文檔,否則會先後端會深深陷入到扯皮中。一個比較笨的方法就是使用 word 或者 md 來維護接口文檔,可是效率過低,接口一變,全部人手上的文檔都得變。在 Spring Boot 中,這個問題常見的解決方案是 Swagger ,使用 Swagger 咱們能夠快速生成一個接口文檔網站,接口一旦發生變化,文檔就會自動更新,全部開發工程師訪問這一個在線網站就能夠獲取到最新的接口文檔,很是方便。
關於 Swagger 的用法,你們能夠參考:SpringBoot整合Swagger2,不再用維護接口文檔了!
WebSocket 是一種計算機通訊協議,經過單個 TCP 鏈接提供全雙工通訊信道。
一、WebSocket 是雙向的 -使用 WebSocket 客戶端或服務器能夠發起消息發送。
二、WebSocket 是全雙工的 -客戶端和服務器通訊是相互獨立的。
三、單個 TCP 鏈接 -初始鏈接使用 HTTP,而後將此鏈接升級到基於套接字的鏈接。而後這個單一鏈接用於全部將來的通訊
四、Light -與 http 相比,WebSocket 消息數據交換要輕得多。
Spring Data 是 Spring 的一個子項目。用於簡化數據庫訪問,支持NoSQL 和 關係數據存儲。其主要目標是使數據庫的訪問變得方便快捷。Spring Data 具備以下特色:
SpringData 項目支持 NoSQL 存儲:
SpringData 項目所支持的關係數據存儲技術:
Spring Data Jpa 致力於減小數據訪問層 (DAO) 的開發量. 開發者惟一要作的,就是聲明持久層的接口,其餘都交給 Spring Data JPA 來幫你完成!Spring Data JPA 經過規範方法的名字,根據符合規範的名字來肯定方法須要實現什麼樣的邏輯。
Spring Boot Batch 提供可重用的函數,這些函數在處理大量記錄時很是重要,包括日誌/跟蹤,事務管理,做業處理統計信息,做業從新啓動,跳過和資源管理。它還提供了更先進的技術服務和功能,經過優化和分區技術,能夠實現極高批量和高性能批處理做業。簡單以及複雜的大批量批處理做業能夠高度可擴展的方式利用框架處理重要大量的信息。
FreeMarker 是一個基於 Java 的模板引擎,最初專一於使用 MVC 軟件架構進行動態網頁生成。使用 Freemarker 的主要優勢是表示層和業務層的徹底分離。程序員能夠處理應用程序代碼,而設計人員能夠處理 html 頁面設計。最後使用freemarker 能夠將這些結合起來,給出最終的輸出頁面。
對於集成 Spring Boot 和 ActiveMQ,咱們使用依賴關係。 它只須要不多的配置,而且不須要樣板代碼。
Apache Kafka 是一個分佈式發佈 - 訂閱消息系統。它是一個可擴展的,容錯的發佈 - 訂閱消息系統,它使咱們可以構建分佈式應用程序。這是一個 Apache 頂級項目。Kafka 適合離線和在線消息消費。
Swagger 普遍用於可視化 API,使用 Swagger UI 爲前端開發人員提供在線沙箱。Swagger 是用於生成 RESTful Web 服務的可視化表示的工具,規範和完整框架實現。它使文檔可以以與服務器相同的速度更新。當經過 Swagger 正肯定義時,消費者可使用最少許的實現邏輯來理解遠程服務並與其進行交互。所以,Swagger消除了調用服務時的猜想。
先後端分離開發日益流行,大部分狀況下,咱們都是經過 Spring Boot 作先後端分離開發,先後端分離必定會有接口文檔,否則會先後端會深深陷入到扯皮中。一個比較笨的方法就是使用 word 或者 md 來維護接口文檔,可是效率過低,接口一變,全部人手上的文檔都得變。在 Spring Boot 中,這個問題常見的解決方案是 Swagger ,使用 Swagger 咱們能夠快速生成一個接口文檔網站,接口一旦發生變化,文檔就會自動更新,全部開發工程師訪問這一個在線網站就能夠獲取到最新的接口文檔,很是方便。
使用了下面的一些依賴項
spring-boot-starter-activemq
spring-boot-starter-security
這有助於增長更少的依賴關係,並減小版本的衝突。
首先,這個 Starter 並不是什麼新的技術點,基本上仍是基於 Spring 已有功能來實現的。首先它提供了一個自動化配置類,通常命名爲 XXXAutoConfiguration
,在這個配置類中經過條件註解來決定一個配置是否生效(條件註解就是 Spring 中本來就有的),而後它還會提供一系列的默認配置,也容許開發者根據實際狀況自定義相關配置,而後經過類型安全的屬性注入將這些配置屬性注入進來,新注入的屬性會代替掉默認屬性。正由於如此,不少第三方框架,咱們只須要引入依賴就能夠直接使用了。固然,開發者也能夠自定義 Starter
咱們都知道,新建立一個 Spring Boot 項目,默認都是有 parent 的,這個 parent 就是 spring-boot-starter-parent ,spring-boot-starter-parent 主要有以下做用:
Spring Boot 項目最終打包成的 jar 是可執行 jar ,這種 jar 能夠直接經過 java -jar xxx.jar
命令來運行,這種 jar 不能夠做爲普通的 jar 被其餘項目依賴,即便依賴了也沒法使用其中的類。
Spring Boot 的 jar 沒法被其餘項目依賴,主要仍是他和普通 jar 的結構不一樣。普通的 jar 包,解壓後直接就是包名,包裏就是咱們的代碼,而 Spring Boot 打包成的可執行 jar 解壓後,在 \BOOT-INF\classes
目錄下才是咱們的代碼,所以沒法被直接引用。若是非要引用,能夠在 pom.xml 文件中增長配置,將 Spring Boot 項目打包成兩個 jar ,一個可執行,一個可引用。
1)打包用命令或者放到容器中運行
2)用 Maven/ Gradle 插件運行
3)直接執行 main 方法運行
能夠不須要,內置了 Tomcat/ Jetty 等容器。
1)繼承spring-boot-starter-parent項目
2)導入spring-boot-dependencies項目依賴
Spring 提供了一種使用 ControllerAdvice 處理異常的很是有用的方法。 咱們經過實現一個 ControlerAdvice 類,來處理控制器類拋出的全部異常。
使用 Spring Boot 實現分頁很是簡單。使用 Spring Data-JPA 能夠實現將可分頁的傳遞給存儲庫方法。
在微服務中,一個完整的項目被拆分紅多個不相同的獨立的服務,各個服務獨立部署在不一樣的服務器上,各自的 session 被從物理空間上隔離開了,可是常常,咱們須要在不一樣微服務之間共享 session ,常見的方案就是 Spring Session + Redis 來實現 session 共享。將全部微服務的 session 統一保存在 Redis 上,當各個微服務對 session 有相關的讀寫操做時,都去操做 Redis 上的 session 。這樣就實現了 session 共享,Spring Session 基於 Spring 中的代理過濾器實現,使得 session 的同步操做對開發人員而言是透明的,很是簡便。
定時任務也是一個常見的需求,Spring Boot 中對於定時任務的支持主要仍是來自 Spring 框架。
在 Spring Boot 中使用定時任務主要有兩種不一樣的方式,一個就是使用 Spring 中的 @Scheduled 註解,另外一個則是使用第三方框架 Quartz。
使用 Spring 中的 @Scheduled 的方式主要經過 @Scheduled 註解來實現。
使用 Quartz ,則按照 Quartz 的方式,定義 Job 和 Trigger 便可。
在微服務中,一個完整的項目被拆分紅多個不相同的獨立的服務,各個服務獨立部署在不一樣的服務器上,各自的 session 被從物理空間上隔離開了,可是常常,咱們須要在不一樣微服務之間共享 session ,常見的方案就是 Spring Session + Redis 來實現 session 共享。將全部微服務的 session 統一保存在 Redis 上,當各個微服務對 session 有相關的讀寫操做時,都去操做 Redis 上的 session 。這樣就實現了 session 共享,Spring Session 基於 Spring 中的代理過濾器實現,使得 session 的同步操做對開發人員而言是透明的,很是簡便。 session 共享你們能夠參考:Spring Boot 一個依賴搞定 session 共享,沒有比這更簡單的方案了!
思考一下在你的虛擬機上部署應用程序須要些什麼。
第一步: 安裝 Java
第二部: 安裝 Web 或者是應用程序的服務器(Tomat/Wbesphere/Weblogic 等等)
第三部: 部署應用程序 war 包
若是咱們想簡化這些步驟,應該如何作呢?
讓咱們來思考如何使服務器成爲應用程序的一部分?
你只須要一個安裝了 Java 的虛擬機,就能夠直接在上面部署應用程序了,
是否是很爽?
這個想法是嵌入式服務器的起源。
當咱們建立一個能夠部署的應用程序的時候,咱們將會把服務器(例如,tomcat)嵌入到可部署的服務器中。
例如,對於一個 Spring Boot 應用程序來講,你能夠生成一個包含 Embedded Tomcat 的應用程序 jar。你就能夠想運行正常 Java 應用程序同樣來運行 web 應用程序了。
嵌入式服務器就是咱們的可執行單元包含服務器的二進制文件(例如,tomcat.jar)。
Spring Boot 實現熱部署其實很容易,引入 devtools 依賴便可,這樣當編譯文件發生變化時,Spring Boot 就會自動重啓。在 Eclipse 中,用戶按下保存按鍵,就會自動編譯進而重啓 Spring Boot,IDEA 中因爲是自動保存的,自動保存時並未編譯,因此須要開發者按下 Ctrl+F9 進行編譯,編譯完成後,項目就自動重啓了。
若是僅僅只是頁面模板發生變化,Java 類並未發生變化,此時能夠不用重啓 Spring Boot,使用 LiveReload 插件就能夠輕鬆實現熱部署。
這可使用 DEV 工具來實現。經過這種依賴關係,您能夠節省任何更改,嵌入式tomcat 將從新啓動。Spring Boot 有一個開發工具(DevTools)模塊,它有助於提升開發人員的生產力。Java 開發人員面臨的一個主要挑戰是將文件更改自動部署到服務器並自動重啓服務器。開發人員能夠從新加載 Spring Boot 上的更改,而無需從新啓動服務器。這將消除每次手動部署更改的須要。Spring Boot 在發佈它的第一個版本時沒有這個功能。這是開發人員最須要的功能。DevTools 模塊徹底知足開發人員的需求。該模塊將在生產環境中被禁用。它還提供 H2 數據庫控制檯以更好地測試應用程序。
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> </dependency>
spring-boot-maven-plugin 提供了一些像 jar 同樣打包或者運行應用程序的命令。
spring-boot:run 運行你的 SpringBooty 應用程序。
spring-boot:repackage 從新打包你的 jar 包或者是 war 包使其可執行
spring-boot:start 和 spring-boot:stop 管理 Spring Boot 應用程序的生命週期(也能夠說是爲了集成測試)。
spring-boot:build-info 生成執行器可使用的構造信息。
你須要作下面兩個步驟:
第二步:取決於你的服務器。
Spring Boot 項目最終打包成的 jar 是可執行 jar ,這種 jar 能夠直接經過 java -jar xxx.jar 命令來運行,這種 jar 不能夠做爲普通的 jar 被其餘項目依賴,即便依賴了也沒法使用其中的類。
Spring Boot 的 jar 沒法被其餘項目依賴,主要仍是他和普通 jar 的結構不一樣。普通的 jar 包,解壓後直接就是包名,包裏就是咱們的代碼,而 Spring Boot 打包成的可執行 jar 解壓後,在 \BOOT-INF\classes 目錄下才是咱們的代碼,所以沒法被直接引用。若是非要引用,能夠在 pom.xml 文件中增長配置,將 Spring Boot 項目打包成兩個 jar ,一個可執行,一個可引用。