springboot的運行原理

這篇文章將為大家詳細講解有關(guān)spring boot的運行原理,文章內(nèi)容質(zhì)量較高,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

創(chuàng)新互聯(lián)建站于2013年成立,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務公司,擁有項目成都網(wǎng)站設(shè)計、成都網(wǎng)站制作網(wǎng)站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元大冶做網(wǎng)站,已為上家服務,為大冶各地企業(yè)和個人服務,聯(lián)系電話:13518219792

spring boot原理是什么:

一、內(nèi)容簡介

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

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

  • 自動配置:Spring Boot基于Spring代碼配置提供了很多常用組件和框架的配置類,從而簡化項目配置

  • 內(nèi)嵌容器:集成Java的常見Web容器,簡化開發(fā)環(huán)境搭建,而且是打包插件打包web應用為可執(zhí)行文件的基礎(chǔ)

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

  • 熱啟動:減少開發(fā)過程中反復啟動容器的次數(shù),提高開發(fā)效率

  • 應用監(jiān)控:為應用審計、健康監(jiān)控、度量數(shù)據(jù)收集提供基本服務

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

二、起步依賴:starter

在常規(guī)的Maven工程中,如果要使用某個框架或者組件,需要導入大量的依賴,而且得注意依賴的版本匹配等問題,在Spring Boot中提供了大量的starter,這樣的starter會借助Maven的依賴傳遞幫我們導入相關(guān)的依賴。比如以下的pom文件,它會添加web相關(guān)的依賴項,包括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>
    .......

原理:我們只是導入了一個依賴項<spring-boot-starter>,但是該依賴項借助Maven的依賴傳遞幫我們導入了大量web開發(fā)要使用的包,如果解壓該依賴對應的<spring-boot-starter-web-2.1.1.RELEASE.jar>文件,我們發(fā)現(xiàn)該jar文件中其實是沒有什么實質(zhì)性內(nèi)容的,因為它只是一個pom項目,實質(zhì)性內(nèi)容在該包對應的<spring-boot-starter-web-2.1.1.RELEASE.pom>文件中,該文件由mavne在下載jar文件時下載,在該文件中聲明了很多依賴項,如:spring-webmvc、spring-web等。

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

有關(guān)maven的依賴傳遞可以參閱相關(guān)資料,簡單描述如下:

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

二、自動配置:AutoConfiguration

Spring Boot會按照某些條件使用默認值自動配置相關(guān)的組件或框架,從而大幅減少項目的配置文件,它在Spring自動掃描和基于代碼配置的基礎(chǔ)上加入了自己的處理流程。以下內(nèi)容先簡單介紹Spring基于代碼配置,然后介紹Spring Boot做了什么。

(一)、Spring基于代碼配置

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

Spring 配置文件

<!-- 數(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è)務代碼

package com.demo.spring.sample.step03.service.impl;.......@Service("userService")
public class UserService implements IUserService {   
   @Autowired
   private IUserDAO userDAO = null;
}

創(chuàng)建Spring上下文

ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");

總結(jié):

通過component-scan告訴Spring去掃描類路徑下加入了@Component、 @Repository、@Service、 @Controlle注解的類,Spring 實例化這些類,并且把實例注冊到Spring上下文中,但是數(shù)據(jù)源、屬性文件等第三方的bean還是采用XML文件來配置,如果要完全消除XML配置文件,還是不太可行的,如果一定要做,相對比較麻煩。

使用 XML配置文件有利有弊,其中一個弊端是無法過多的定制bean的實例化過程,比如以上的dataSource,如果想要在類路徑下有oracle的jdbc驅(qū)動時才去實例化,這是無法完成的。還有一個弊端是代碼邏輯分散,因為有一部分的邏輯是在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;
    }}

業(yè)務代碼

package com.demo.spring.sample.step03.service.impl;.......@Service("userService")
public class UserService implements IUserService {   
   @Autowired
   private IUserDAO userDAO = null;
}

創(chuàng)建Spring上下文

ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);

總結(jié):

創(chuàng)建Spring上下文時不再使用基于XML的配置,配置文件消失,由AppConfig這個類來代替,這個類需要加@Configuration注解,而且該類中可以有加@Bean注解的方法,容器會自動調(diào)用這樣的方法來實例化Bean。

(二)、Spring Boot的自動配置

Spring Boot幫寫了大量的加入了@Configuration注解的類,每個類提供一種組件或框架的配置,比如DataSourceConfiguration.java中的靜態(tài)內(nèi)部類Dbcp2,它提供DBCP數(shù)據(jù)源的配置

//DBCP 數(shù)據(jù)源配置.
@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);
   }

}

總結(jié):

當Spring Boot啟動的基本步驟走完后,  如果啟用了自動配置,Spring Boot會加載<spring-boot-autoconfigure-2.1.1.RELEASE.jar>下的<\META-INF\spring.factories>文件中的內(nèi)容,該文件中定義了有關(guān)自動配置的信息,其中EnableAutoConfiguration對應的每一個類中都加入了注解@Configuration,也就是說這樣的每一個類都相當于Spring的一個或多個配置文件,而其中加注解@Bean的方法是bean的工廠方法,會由Spring上下文自動調(diào)用,并且將返回的對象注冊到上下文中。

spring.factories文件中自動配置類的部分內(nèi)容

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
......
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
......

(三)、如何覆蓋自動配置的屬性

Spring Boot的自動配置會采用大量的默認值(約定由于配置),可以通過在類路徑下提供application.properties或者application.yml配置文件來覆蓋默認值,當然部分屬性值必須通過該配置文件來提供,比如如果要使用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中移除這樣的依賴就可以,當然這個時候如果要通過Spring Boot使用Web相關(guān)框架,則需要打包為war包后獨立部署,或者在開發(fā)過程中使用IDE環(huán)境的開發(fā)部署功能。

不使用內(nèi)嵌容器的Web應用在打包時需要對工程進行一定的修改。

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

Maven使用的默認打包工具支持打包jar文件或者war文件,但是打包后的jar文件中不能再嵌入jar文件,而打包后的war文件不能直接運行,為了把工程所有文件打包為一個可直接運行的jar文件或war文件,spring提供了一個maven插件來解決這樣的問題。當然這個插件還提諸如spring-boot:run這樣的開發(fā)功能

五、熱啟動 :devtools

在開發(fā)過程中,當完成一個功能單元后,我們會啟動程序查看運行效果,如果代碼需要再次修改,則修改后需要關(guān)掉程序,然后重啟程序,這個過程不斷迭代,從而完成代碼的編寫、調(diào)試。

Spring Boot 熱啟動通過重寫容器的類加載器,完成程序的部分重啟,從而簡化、加速程序的調(diào)試過程。spring-boot-devtools通過兩個類加載器分別加載依賴庫和項目代碼,當spring-boot-devtools發(fā)現(xiàn)項目的編譯輸出路徑下有變化時,通過其中的一個類加載器重新加載所有的項目自有代碼,從而完成熱啟動。這樣的熱啟動比冷啟動(關(guān)閉、重啟)要快很多,到底快多少取決于項目自有代碼的數(shù)量。

和熱啟動對應的還有一個熱替換,是指單獨地替換被修改的某一個class到j(luò)vm中,甚至可以單獨替換class的某個方法,這種方式比熱啟動要快,通常使用 JavaAgent 攔截默認加載器的行為來實現(xiàn),spring有個獨立的項目Spring Loaded就是這么做的,但是項目已經(jīng)被移到了 attic 了,也就是被Spring束之高閣,所以不建議使用。

六、應用監(jiān)控:actuator

如果類路徑中有actuator這個組件的話,Spring Boot的自動配置會自動創(chuàng)建一些端點(端點:遵循Restful設(shè)計風格的資源,對應于Controller的某一個處理請求的方法),這些端點接受請求后返回有關(guān)應用的相關(guān)信息,比如:健康信息、線程信息等。返回的是json格式的數(shù)據(jù),而使用 Spring Boot Admin 可以實現(xiàn)這些 JSON 數(shù)據(jù)的視圖展現(xiàn),當然也可以為其他應用監(jiān)控系統(tǒng)監(jiān)控當前系統(tǒng)提供服務。

七、問題:

為什么pom文件中要繼承spring-boot-starter-parent?

spring-boot-starter-parent是spring-boot提供的一個pom,在該pom中定義了很多屬性,比如:java源文件的字符編碼,編譯級別等,還有依賴管理、資源定義的相關(guān)pom配置,項目的pom如果繼承starter-parent,可以減少相關(guān)配置

看完上述內(nèi)容,你們對spring boot的運行原理有進一步的了解嗎?如果還想了解更多相關(guān)內(nèi)容,歡迎關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,感謝各位的閱讀。

文章標題:springboot的運行原理
瀏覽路徑:http://muchs.cn/article26/gpgpcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、企業(yè)網(wǎng)站制作、域名注冊、網(wǎng)站導航關(guān)鍵詞優(yōu)化、Google

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都做網(wǎng)站