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

spring boot原理是什麼

hzc
發布: 2020-06-16 14:14:35
原創
7306 人瀏覽過

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中文網其他相關文章!

相關標籤:
來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
最新問題
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板