spring boot原理是什麼:
#一、內(nèi)容簡介
透過《Spring Boot 體驗》介紹了Spring Boot可以幹什麼,這篇文章主要來解析它各個功能點的基本實現(xiàn)思路,從而對Spring Boot有個整體的理性認(rèn)知。
依賴管理:Spring Boot做了大量的starter,而starter只是幫我們導(dǎo)入依賴項的一個入口,簡化專案依賴管理
自動配置:Spring Boot基於Spring程式碼配置提供了許多常用元件和框架的組態(tài)類,從而簡化專案組態(tài)
內(nèi)嵌容器:整合Java的常見Web容器,簡化開發(fā)環(huán)境搭建,而且是打包插件打包web應(yīng)用為可執(zhí)行文件的基礎(chǔ)
Maven插件:用於打包可直接運行的jar文件或war文件,為項目的開箱即用提供支持,當(dāng)然還有輔助開發(fā)的一些小功能
熱啟動:減少開發(fā)過程中反覆啟動容器的次數(shù),提高開發(fā)效率
#應(yīng)用監(jiān)控:為應(yīng)用審計、健康監(jiān)控、度量資料收集提供基本服務(wù)
CLI(命令列工具):進行快速原型搭建,沒有必要使用
二、起始依賴:starter
在常規(guī)的Maven工程中,如果要使用某個框架或元件,需要導(dǎo)入大量的依賴,而且得注意依賴的版本匹配等問題,在Spring Boot中提供了大量的starter,這樣的starter會藉助Maven的依賴傳遞幫我們導(dǎo)入相關(guān)的依賴。例如以下的pom文件,它會加入web相關(guān)的依賴項,包括Spring Web、Spring MVC等:
....... <dependencies> <!--Web應(yīng)用程序的典型依賴項--> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <version>2.1.1.RELEASE</version> </dependency> </dependencies> .......
原理:我們只是導(dǎo)入了一個依賴項
簡而言之,我們的專案如果依賴了某個starter,那麼該starter又會依賴很多其他依賴項,而Maven的依賴傳遞會把starter依賴的依賴項加入我們的專案中。 starter只是做為了一個我們專案依賴項的導(dǎo)入中介。
有關(guān)maven的依賴傳遞可以參考相關(guān)資料,簡單描述如下:
專案A依賴B,B又依賴C。專案A只需要聲明依賴B,不需要聲明依賴C, Maven自動管理這種依賴的傳遞。
二、自動配置:AutoConfiguration
Spring Boot會按照某些條件使用預(yù)設(shè)值自動配置相關(guān)的元件或框架,從而大幅減少專案的配置文件,它在Spring自動掃描和基於程式碼配置的基礎(chǔ)上加入了自己的處理流程。以下內(nèi)容先簡單介紹Spring基於程式碼配置,然後介紹Spring Boot做了什麼。
(一)、Spring基於程式碼設(shè)定
在Spring3以前,使用Spring上下文的方式一般是如下的:
Spring 設(shè)定檔
<!-- 數(shù)據(jù)源 --> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="oracle.jdbc.driver.OracleDriver" /> <property name="url" value="jdbc:oracle:thin:@localhost:1521:xe" /> <property name="username" value="hr" /> <property name="password" value="hr" /></bean> <!--組件掃描--> <context:component-scan base-package="com.demo.spring.sample.step03.?rvic?" />
業(yè)務(wù)代碼
package com.demo.spring.sample.step03.service.impl;.......@Service("userService") public class UserService implements IUserService { @Autowired private IUserDAO userDAO = null; }
建立Spring上下文
ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
總結(jié):
#透過component-scan告訴Spring去掃描類別路徑下加入了@Component、 @Repository、@Service、 @ Controlle註解的類,Spring 實例化這些類,並且把實例註冊到Spring上下文中,但是資料來源、屬性檔案等第三方的bean還是採用XML檔案來配置,如果要完全消除XML配置文件,還是不太可行的,如果一定要做,相對比較麻煩。
使用XML設(shè)定檔有利有弊,其中一個弊端是無法過多的客製化bean的實例化過程,例如以上的dataSource,如果想要在類別路徑下有oracle的jdbc驅(qū)動時才去實例化,這是無法完成的。還有一個弊端是程式碼邏輯分散,因為有一部分的邏輯是在XML中配置的;當(dāng)然好處就是配置集中化,而且方便配置切換。
在Spring3以後,可以透過如下的方式使用Spring容器:
Spring 設(shè)定類別
@Configuration // 表明當(dāng)前類提供Spring配置文件的作用,Spring上下文會從當(dāng)前類的注解中提取配置信息 @ComponentScan(basePackages = "com.demo.spring.sample.step08") // 開啟組件掃描 public class AppConfig { @Bean // 表示這個方法實例化一個bean,id=dataSource public DataSource dataSource() { DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setDriverClassName(driverClassName); dataSource.setUrl(url); dataSource.setUsername(userName); dataSource.setPassword(password); return dataSource; }}
業(yè)務(wù)程式碼
package com.demo.spring.sample.step03.service.impl;.......@Service("userService") public class UserService implements IUserService { @Autowired private IUserDAO userDAO = null; }
建立Spring上下文
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
總結(jié):
建立Spring上下文時不再使用基於XML的配置,設(shè)定檔消失,由AppConfig這個類別來代替,這個類別需要加@Configuration註解,而且該類別中可以有加@Bean註解的方法,容器會自動呼叫這樣的方法來實例化Bean。
(二)、Spring Boot的自動配置
Spring Boot幫寫了大量的加入了@Configuration註解的類,每個類提供一種組件或框架的配置,例如DataSourceConfiguration .java中的靜態(tài)內(nèi)部類別Dbcp2,它提供DBCP資料來源的配置
//DBCP 數(shù)據(jù)源配置. @Configuration //這個注解在實際代碼中沒有加,當(dāng)前類被其它配置類Import @ConditionalOnClass(org.apache.commons.dbcp2.BasicDataSource.class) @ConditionalOnMissingBean(DataSource.class) @ConditionalOnProperty(name = "spring.datasource.type", matchIfMissing = true,havingValue = "org.apache.commons.dbcp2.BasicDataSource") static class Dbcp2 { @Bean @ConfigurationProperties(prefix = "spring.datasource.dbcp2") public org.apache.commons.dbcp2.BasicDataSource dataSource( DataSourceProperties properties) { return createDataSource(properties, org.apache.commons.dbcp2.BasicDataSource.class); } }
總結(jié):
當(dāng)Spring Boot啟動的基本步驟走完后, 如果啟用了自動配置,Spring Boot會加載
spring.factories文件中自動配置類的部分內(nèi)容
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ ...... org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\ ......
(三)、如何覆蓋自動配置的屬性
Spring Boot的自動配置會采用大量的默認(rèn)值(約定由于配置),可以通過在類路徑下提供application.properties或者application.yml配置文件來覆蓋默認(rèn)值,當(dāng)然部分屬性值必須通過該配置文件來提供,比如如果要使用Spring Boot對數(shù)據(jù)源的自動配置,則在配置文件中必須提供jdbc的url,否則會拋出異常。
三、集成內(nèi)嵌容器 :main方法
Spring Boot支持的內(nèi)嵌容器Tomcat、Jetty、Undertow本身就支持在Java中內(nèi)嵌使用,因為這些容器本身就是使用Java編寫的,只不過Spring Boot在main方法的調(diào)用鏈中根據(jù)自動配置嵌入了這樣的容器。
不使用這樣的內(nèi)嵌容器也是可以的,在Maven中移除這樣的依賴就可以,當(dāng)然這個時候如果要通過Spring Boot使用Web相關(guān)框架,則需要打包為war包后獨立部署,或者在開發(fā)過程中使用IDE環(huán)境的開發(fā)部署功能。
不使用內(nèi)嵌容器的Web應(yīng)用在打包時需要對工程進行一定的修改。
四、打包可運行文件 :maven-plugin
Maven使用的默認(rèn)打包工具支持打包jar文件或者war文件,但是打包后的jar文件中不能再嵌入jar文件,而打包后的war文件不能直接運行,為了把工程所有文件打包為一個可直接運行的jar文件或war文件,spring提供了一個maven插件來解決這樣的問題。當(dāng)然這個插件還提諸如spring-boot:run這樣的開發(fā)功能
五、熱啟動 :devtools
在開發(fā)過程中,當(dāng)完成一個功能單元后,我們會啟動程序查看運行效果,如果代碼需要再次修改,則修改后需要關(guān)掉程序,然后重啟程序,這個過程不斷迭代,從而完成代碼的編寫、調(diào)試。
Spring Boot 熱啟動通過重寫容器的類加載器,完成程序的部分重啟,從而簡化、加速程序的調(diào)試過程。spring-boot-devtools通過兩個類加載器分別加載依賴庫和項目代碼,當(dāng)spring-boot-devtools發(fā)現(xiàn)項目的編譯輸出路徑下有變化時,通過其中的一個類加載器重新加載所有的項目自有代碼,從而完成熱啟動。這樣的熱啟動比冷啟動(關(guān)閉、重啟)要快很多,到底快多少取決于項目自有代碼的數(shù)量。
和熱啟動對應(yīng)的還有一個熱替換,是指單獨地替換被修改的某一個class到j(luò)vm中,甚至可以單獨替換class的某個方法,這種方式比熱啟動要快,通常使用 JavaAgent 攔截默認(rèn)加載器的行為來實現(xiàn),spring有個獨立的項目Spring Loaded就是這么做的,但是項目已經(jīng)被移到了 attic 了,也就是被Spring束之高閣,所以不建議使用。
六、應(yīng)用監(jiān)控:actuator
如果類路徑中有actuator這個組件的話,Spring Boot的自動配置會自動創(chuàng)建一些端點(端點:遵循Restful設(shè)計風(fēng)格的資源,對應(yīng)于Controller的某一個處理請求的方法),這些端點接受請求后返回有關(guān)應(yīng)用的相關(guān)信息,比如:健康信息、線程信息等。返回的是json格式的數(shù)據(jù),而使用 Spring Boot Admin 可以實現(xiàn)這些 JSON 數(shù)據(jù)的視圖展現(xiàn),當(dāng)然也可以為其他應(yīng)用監(jiān)控系統(tǒng)監(jiān)控當(dāng)前系統(tǒng)提供服務(wù)。
七、問題:
為什么pom文件中要繼承spring-boot-starter-parent?
spring-boot-starter-parent是spring-boot提供的一個pom,在該pom中定義了很多屬性,比如:java源文件的字符編碼,編譯級別等,還有依賴管理、資源定義的相關(guān)pom配置,項目的pom如果繼承starter-parent,可以減少相關(guān)配置
推薦教程: 《java教程》
以上是spring boot原理是什麼的詳細內(nèi)容。更多資訊請關(guān)注PHP中文網(wǎng)其他相關(guān)文章!

熱AI工具

Undress AI Tool
免費脫衣圖片

Undresser.AI Undress
人工智慧驅(qū)動的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6
視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

熱門話題

隨著大數(shù)據(jù)時代的到來,越來越多的企業(yè)開始了解並認(rèn)識到大數(shù)據(jù)的價值,並將其運用到商業(yè)中。而隨之而來的問題就是如何處理這些大流量的數(shù)據(jù)。在這種情況下,大數(shù)據(jù)處理應(yīng)用程式成為了每個企業(yè)必須考慮的事情。而對於開發(fā)人員而言,如何使用SpringBoot建立一個高效的大數(shù)據(jù)處理應(yīng)用程式也是一個非常重要的問題。 SpringBoot是一個非常流行的Java框架,它可以讓

隨著技術(shù)的不斷發(fā)展,我們現(xiàn)在可以使用不同的技術(shù)來建立桌面應(yīng)用程式。而SpringBoot和JavaFX則是現(xiàn)在較為流行的選擇之一。本文將重點放在如何使用這兩個框架來建立一個功能豐富的桌面應(yīng)用程式。一、介紹SpringBoot和JavaFXSpringBoot是基於Spring框架的快速開發(fā)框架。它可以幫助開發(fā)者快速建立Web應(yīng)用程序,同時提供一組開

隨著比特幣等數(shù)位貨幣的興起,區(qū)塊鏈技術(shù)也逐漸成為熱門話題。而智能合約,則可視為區(qū)塊鏈技術(shù)的重要組成部分。 SpringBoot作為一種流行的Java後端開發(fā)框架,也能夠用來建立區(qū)塊鏈應(yīng)用和智慧合約。本文將介紹如何利用SpringBoot來建構(gòu)基於區(qū)塊鏈技術(shù)的應(yīng)用與智慧合約。一、SpringBoot與區(qū)塊鏈?zhǔn)紫?,我們需要了解一些與區(qū)塊鏈相關(guān)的基本概念。區(qū)塊鏈

我們在實際專案中,盡量規(guī)避分散式事務(wù)。但是,有些時候是真的需要做一些服務(wù)拆分從而會引出分散式事務(wù)問題。同時,分散式事務(wù)也是面試中市場被問到,可以拿著這個案例練練手,面試就可以說上個123了。

隨著現(xiàn)代企業(yè)越來越依賴各種不同的應(yīng)用程式和系統(tǒng),企業(yè)整合變得愈發(fā)重要。企業(yè)服務(wù)匯流排(ESB)就是一種整合架構(gòu)模式,透過將不同系統(tǒng)和應(yīng)用程式連接在一起,提供通用的資料交換和訊息路由服務(wù),從而實現(xiàn)企業(yè)級應(yīng)用程式整合。使用SpringBoot和ApacheServiceMix,我們可以輕鬆建立一個ESB系統(tǒng),這篇文章將介紹如何實作。 SpringBoot和A

SpringBoot是一款非常受歡迎的Java開發(fā)框架,不僅具有快速開發(fā)的優(yōu)勢,而且還內(nèi)建了許多實用的功能,其中,任務(wù)調(diào)度和定時任務(wù)就是其常用的功能之一。本文將探討SpringBoot的任務(wù)調(diào)度和定時任務(wù)實現(xiàn)方法。一、SpringBoot任務(wù)調(diào)度簡介SpringBoot任務(wù)調(diào)度(TaskScheduling)是指在特定的時間點或某個條件下,執(zhí)行一些特

在現(xiàn)代Web應(yīng)用程式開發(fā)中,WebSocket是實現(xiàn)即時通訊和即時資料傳輸?shù)某S眉夹g(shù)。 SpringBoot框架提供了整合WebSocket的支持,讓開發(fā)者可以非常方便地實現(xiàn)推播和通知功能。本文將介紹SpringBoot中如何使用WebSocket實現(xiàn)推播和通知功能,並示範(fàn)一個簡單的即時線上聊天室的實作。創(chuàng)建SpringBoot專案首先,我們需要創(chuàng)建一個

隨著全球化的發(fā)展,越來越多的網(wǎng)站和應(yīng)用需要提供多語言支援和國際化功能。對於開發(fā)人員而言,實現(xiàn)這些功能並不是一件容易的事情,因為它需要考慮許多方面的問題,例如語言的翻譯、日期、時間和貨幣格式等等。但是,使用SpringBoot框架,我們可以輕鬆實現(xiàn)多語言支援和國際化應(yīng)用。首先,讓我們來了解一下SpringBoot提供的LocaleResolver介面。 Loc
