首頁 Java Java入門 spring boot原理是什麼

spring boot原理是什麼

Jun 16, 2020 pm 02:14 PM
spring boot

spring boot原理是什麼

spring boot原理是什麼:

#一、內容簡介

透過《Spring Boot 體驗》介紹了Spring Boot可以幹什麼,這篇文章主要來解析它各個功能點的基本實現思路,從而對Spring Boot有個整體的理性認知。

  • 依賴管理:Spring Boot做了大量的starter,而starter只是幫我們導入依賴項的一個入口,簡化專案依賴管理

  • 自動配置:Spring Boot基於Spring程式碼配置提供了許多常用元件和框架的組態類,從而簡化專案組態

  • 內嵌容器:整合Java的常見Web容器,簡化開發環境搭建,而且是打包插件打包web應用為可執行文件的基礎

  • Maven插件:用於打包可直接運行的jar文件或war文件,為項目的開箱即用提供支持,當然還有輔助開發的一些小功能

  • 熱啟動:減少開發過程中反覆啟動容器的次數,提高開發效率

  • #應用監控:為應用審計、健康監控、度量資料收集提供基本服務

  • CLI(命令列工具):進行快速原型搭建,沒有必要使用

二、起始依賴:starter

在常規的Maven工程中,如果要使用某個框架或元件,需要導入大量的依賴,而且得注意依賴的版本匹配等問題,在Spring Boot中提供了大量的starter,這樣的starter會藉助Maven的依賴傳遞幫我們導入相關的依賴。例如以下的pom文件,它會加入web相關的依賴項,包括Spring Web、Spring MVC等:

    .......    <dependencies>
        <!--Web应用程序的典型依赖项-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
            <version>2.1.1.RELEASE</version>
        </dependency>

    </dependencies>
    .......
登入後複製

原理:我們只是導入了一個依賴項,但是該依賴項借助Maven的依賴傳遞幫我們導入了大量web開發要使用的包,如果解壓縮該依賴對應的文件,我們發現該jar文件中其實是沒有什麼實質內容的,因為它只是一個pom項目,實質性內容在該包對應的文件中,該文件由mavne在下載jar檔時下載,在該檔案中聲明了許多依賴項,如:spring-webmvc、spring-web等。

簡而言之,我們的專案如果依賴了某個starter,那麼該starter又會依賴很多其他依賴項,而Maven的依賴傳遞會把starter依賴的依賴項加入我們的專案中。 starter只是做為了一個我們專案依賴項的導入中介。

有關maven的依賴傳遞可以參考相關資料,簡單描述如下:

專案A依賴B,B又依賴C。專案A只需要聲明依賴B,不需要聲明依賴C, Maven自動管理這種依賴的傳遞。

二、自動配置:AutoConfiguration

Spring Boot會按照某些條件使用預設值自動配置相關的元件或框架,從而大幅減少專案的配置文件,它在Spring自動掃描和基於程式碼配置的基礎上加入了自己的處理流程。以下內容先簡單介紹Spring基於程式碼配置,然後介紹Spring Boot做了什麼。

(一)、Spring基於程式碼設定

在Spring3以前,使用Spring上下文的方式一般是如下的:

Spring 設定檔

<!-- 数据源 -->
 <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?" />
登入後複製

業務代碼

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");
登入後複製

總結:

#透過component-scan告訴Spring去掃描類別路徑下加入了@Component、 @Repository、@Service、 @ Controlle註解的類,Spring 實例化這些類,並且把實例註冊到Spring上下文中,但是資料來源、屬性檔案等第三方的bean還是採用XML檔案來配置,如果要完全消除XML配置文件,還是不太可行的,如果一定要做,相對比較麻煩。

使用XML設定檔有利有弊,其中一個弊端是無法過多的客製化bean的實例化過程,例如以上的dataSource,如果想要在類別路徑下有oracle的jdbc驅動時才去實例化,這是無法完成的。還有一個弊端是程式碼邏輯分散,因為有一部分的邏輯是在XML中配置的;當然好處就是配置集中化,而且方便配置切換。

在Spring3以後,可以透過如下的方式使用Spring容器:

Spring 設定類別

@Configuration // 表明当前类提供Spring配置文件的作用,Spring上下文会从当前类的注解中提取配置信息
@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;
    }}
登入後複製

業務程式碼

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);
登入後複製

總結:

建立Spring上下文時不再使用基於XML的配置,設定檔消失,由AppConfig這個類別來代替,這個類別需要加@Configuration註解,而且該類別中可以有加@Bean註解的方法,容器會自動呼叫這樣的方法來實例化Bean。

(二)、Spring Boot的自動配置

Spring Boot幫寫了大量的加入了@Configuration註解的類,每個類提供一種組件或框架的配置,例如DataSourceConfiguration .java中的靜態內部類別Dbcp2,它提供DBCP資料來源的配置

//DBCP 数据源配置.
@Configuration //这个注解在实际代码中没有加,当前类被其它配置类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);
   }

}
登入後複製

總結:

当Spring Boot启动的基本步骤走完后, 如果启用了自动配置,Spring Boot会加载下的<\META-INF\spring.factories>文件中的内容,该文件中定义了有关自动配置的信息,其中EnableAutoConfiguration对应的每一个类中都加入了注解@Configuration,也就是说这样的每一个类都相当于Spring的一个或多个配置文件,而其中加注解@Bean的方法是bean的工厂方法,会由Spring上下文自动调用,并且将返回的对象注册到上下文中。

spring.factories文件中自动配置类的部分内容

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
......
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
......
登入後複製

(三)、如何覆盖自动配置的属性

Spring Boot的自动配置会采用大量的默认值(约定由于配置),可以通过在类路径下提供application.properties或者application.yml配置文件来覆盖默认值,当然部分属性值必须通过该配置文件来提供,比如如果要使用Spring Boot对数据源的自动配置,则在配置文件中必须提供jdbc的url,否则会抛出异常。

三、集成内嵌容器 :main方法

Spring Boot支持的内嵌容器Tomcat、Jetty、Undertow本身就支持在Java中内嵌使用,因为这些容器本身就是使用Java编写的,只不过Spring Boot在main方法的调用链中根据自动配置嵌入了这样的容器。

不使用这样的内嵌容器也是可以的,在Maven中移除这样的依赖就可以,当然这个时候如果要通过Spring Boot使用Web相关框架,则需要打包为war包后独立部署,或者在开发过程中使用IDE环境的开发部署功能。

不使用内嵌容器的Web应用在打包时需要对工程进行一定的修改。

四、打包可运行文件 :maven-plugin

Maven使用的默认打包工具支持打包jar文件或者war文件,但是打包后的jar文件中不能再嵌入jar文件,而打包后的war文件不能直接运行,为了把工程所有文件打包为一个可直接运行的jar文件或war文件,spring提供了一个maven插件来解决这样的问题。当然这个插件还提诸如spring-boot:run这样的开发功能

五、热启动 :devtools

在开发过程中,当完成一个功能单元后,我们会启动程序查看运行效果,如果代码需要再次修改,则修改后需要关掉程序,然后重启程序,这个过程不断迭代,从而完成代码的编写、调试。

Spring Boot 热启动通过重写容器的类加载器,完成程序的部分重启,从而简化、加速程序的调试过程。spring-boot-devtools通过两个类加载器分别加载依赖库和项目代码,当spring-boot-devtools发现项目的编译输出路径下有变化时,通过其中的一个类加载器重新加载所有的项目自有代码,从而完成热启动。这样的热启动比冷启动(关闭、重启)要快很多,到底快多少取决于项目自有代码的数量。

和热启动对应的还有一个热替换,是指单独地替换被修改的某一个class到jvm中,甚至可以单独替换class的某个方法,这种方式比热启动要快,通常使用 JavaAgent 拦截默认加载器的行为来实现,spring有个独立的项目Spring Loaded就是这么做的,但是项目已经被移到了 attic 了,也就是被Spring束之高阁,所以不建议使用。

六、应用监控:actuator

如果类路径中有actuator这个组件的话,Spring Boot的自动配置会自动创建一些端点(端点:遵循Restful设计风格的资源,对应于Controller的某一个处理请求的方法),这些端点接受请求后返回有关应用的相关信息,比如:健康信息、线程信息等。返回的是json格式的数据,而使用 Spring Boot Admin 可以实现这些 JSON 数据的视图展现,当然也可以为其他应用监控系统监控当前系统提供服务。

七、问题:

为什么pom文件中要继承spring-boot-starter-parent?

spring-boot-starter-parent是spring-boot提供的一个pom,在该pom中定义了很多属性,比如:java源文件的字符编码,编译级别等,还有依赖管理、资源定义的相关pom配置,项目的pom如果继承starter-parent,可以减少相关配置

推荐教程: 《java教程

以上是spring boot原理是什麼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

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

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

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

Spring Boot+MyBatis+Atomikos+MySQL(附源碼) Spring Boot+MyBatis+Atomikos+MySQL(附源碼) Aug 15, 2023 pm 04:12 PM

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

如何使用Spring Boot建立大數據處理應用 如何使用Spring Boot建立大數據處理應用 Jun 23, 2023 am 09:07 AM

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

透過Spring Boot實現多語言支援和國際化應用 透過Spring Boot實現多語言支援和國際化應用 Jun 23, 2023 am 09:09 AM

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

如何利用Spring Boot建立區塊鏈應用和智慧合約 如何利用Spring Boot建立區塊鏈應用和智慧合約 Jun 22, 2023 am 09:33 AM

隨著比特幣等數位貨幣的興起,區塊鏈技術也逐漸成為熱門話題。而智能合約,則可視為區塊鏈技術的重要組成部分。 SpringBoot作為一種流行的Java後端開發框架,也能夠用來建立區塊鏈應用和智慧合約。本文將介紹如何利用SpringBoot來建構基於區塊鏈技術的應用與智慧合約。一、SpringBoot與區塊鏈首先,我們需要了解一些與區塊鏈相關的基本概念。區塊鏈

基於Spring Boot和MyBatis Plus實作ORM映射 基於Spring Boot和MyBatis Plus實作ORM映射 Jun 22, 2023 pm 09:27 PM

在Javaweb應用程式開發過程中,ORM(Object-RelationalMapping)映射技術用來將資料庫中的關係型資料對應到Java物件中,方便開發者進行資料存取與操作。 SpringBoot作為目前最受歡迎的Javaweb開發框架之一,已經提供了整合MyBatis的方式,而MyBatisPlus則是在MyBatis的基礎上擴展的一種ORM框架。

Spring Boot與NoSQL資料庫的整合使用 Spring Boot與NoSQL資料庫的整合使用 Jun 22, 2023 pm 10:34 PM

隨著網路的發展,大數據分析和即時資訊處理成為了企業的重要需求。為了滿足這樣的需求,傳統的關係型資料庫已經不再滿足業務和技術發展的需要。相反,使用NoSQL資料庫已經成為了一個重要的選擇。在這篇文章中,我們將討論SpringBoot與NoSQL資料庫的整合使用,以實現現代應用程式的開發和部署。什麼是NoSQL資料庫?NoSQL是notonlySQL

使用Spring Boot和Apache ServiceMix建置ESB系統 使用Spring Boot和Apache ServiceMix建置ESB系統 Jun 22, 2023 pm 12:30 PM

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

基於Spring Boot的分散式資料快取和儲存系統 基於Spring Boot的分散式資料快取和儲存系統 Jun 22, 2023 am 09:48 AM

隨著網路的不斷發展和普及,資料的處理和儲存需求也越來越大,如何有效率且可靠地處理和儲存資料成為了業界和研究人員的熱門話題。基於SpringBoot的分散式資料快取和儲存系統是近年來備受關注的解決方案。什麼是分散式資料快取和儲存系統?分散式資料快取和儲存系統是指透過多個節點(伺服器)分散式儲存數據,提高了資料的安全性和可靠性,同時也可以提升資料的處理性

See all articles