Spring Boot 入门简介

概述

Spring Boot 是简化 Spring 应用开发的一个框架块,它整合了 Spring 的整个技术栈,提供了 J2EE 开发一站式解决方案。
它的目标是让你无需手动进行繁杂的配置或者只需要用到很少的配置就可以快速将你的项目运行起来。

核心功能

  • 内置 Tomat,Jetty 和 Undertow servlet 容器,可以独立运行应用,无需打 war 包
  • 提供一系列的 starter pom 来简化 maven 的依赖加载,可以将 starter pom 理解为实现某个功能所需的相关依赖的集合
  • 自动配置 Spring,会根据项目类路径中的 jar 包,类来自动配置 Bean,从而减少手动配置,涵盖了大多数的开发场景,如果有需要可以自定义自动配置。
  • 准生产的应用监控,如 指标,健康检查和外部化配置
  • 无代码生成和 xml 配置,即 springboot 不是由代码生成来实现的,而是通过条件注解来实现,这是 Spring4.x 提供的新特性。

Spring Boot starter

Starter parent

spring-boot-starter-parent, 就是 pom 文件中的这段

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.5.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

它是启动 Spring Boot 应用的父依赖,包含了要使用的Java的默认版本,SpringBoot使用的依赖项的默认版本以及Maven插件的默认配置, 点击进去,可以看到它的几个重要配置如下,其中它默认读取资源目录下的 application 文件来进行应用配置,如果没有内容则使用默认的配置,支持 .properties, .yml 和 yaml 格式。

<?xml version="1.0" encoding="utf-8"?><project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-dependencies</artifactId>
    <version>2.2.5.RELEASE</version>
    <relativePath>../../spring-boot-dependencies</relativePath>
  </parent>
  <artifactId>spring-boot-starter-parent</artifactId>
  <packaging>pom</packaging>
  <name>Spring Boot Starter Parent</name>
  <description>Parent pom providing dependency and plugin management for applications
        built with Maven</description>
  <url>https://projects.spring.io/spring-boot/#/spring-boot-starter-parent</url>
  <properties>
    <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
    <java.version>1.8</java.version>
    <resource.delimiter>@</resource.delimiter>
    <maven.compiler.source>${java.version}</maven.compiler.source>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.target>${java.version}</maven.compiler.target>
  </properties>
  
  ...
  
      <resource>
        <filtering>true</filtering>
        <directory>${basedir}/src/main/resources</directory>
        <includes>
          <include>**/application*.yml</include>
          <include>**/application*.yaml</include>
          <include>**/application*.properties</include>
        </includes>
      </resource>
  
  ···
  
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <configuration>
            <parameters>true</parameters>
          </configuration>
        </plugin>
        
        <plugin>
          <artifactId>maven-jar-plugin</artifactId>
          <configuration>
            <archive>
              <manifest>
                <mainClass>${start-class}</mainClass>
                <addDefaultImplementationEntries>true</addDefaultImplementationEntries>
              </manifest>
            </archive>
          </configuration>
        </plugin>

    ...

spring-boot-starter-parent 还继承了 spring-boot-dependencies,这个 pom文件才是真正定义了所有相关依赖及其默认版本:

<properties>
    <activemq.version>5.15.12</activemq.version>
    <antlr2.version>2.7.7</antlr2.version>
    <appengine-sdk.version>1.9.79</appengine-sdk.version>
    <artemis.version>2.10.1</artemis.version>
    <aspectj.version>1.9.5</aspectj.version>
    <assertj.version>3.13.2</assertj.version>
    <atomikos.version>4.0.6</atomikos.version>
    <awaitility.version>4.0.2</awaitility.version>
    <bitronix.version>2.1.4</bitronix.version>
    <build-helper-maven-plugin.version>3.0.0</build-helper-maven-plugin.version>
    <byte-buddy.version>1.10.8</byte-buddy.version>
    <caffeine.version>2.8.1</caffeine.version>

    ...
</properties>    

Spring Boot 已经给定了大多数场景下依赖的默认版本,如果有需要你也可以在自己项目的pom文件中使用其他版本,比如 mysql-connector-java 的默认版本是 8.0.19,改为 8.0.18

    <properties>
        <java.version>1.8</java.version>
         <mysql.version>8.0.18</mysql.version>
    </properties>

    <dependencies>
        <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <version>${mysql.version}</version>
    </dependency>
    </dependencies>

Starter templates

Spring Boot starter 是包含启动特定功能所需的所有相关传递依赖项的集合,比如你想要创建一个 spring mvc 应用,如果按照传统方式,你需要添加所有相关依赖在 pom 文件中并给定版本,这样就很可能造成版本冲突,而 starter 已经为你提供了相关所有依赖,你只需要添加如下依赖即可:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

Spring Boot 提供了超过50种开箱即用的 starter pom,可以满足绝大多数的应用场景,比如关系型及非关系型数据库连接,应用监控,日志框架,模板渲染,web service支持等。

一些常用的 starter

名称 描述
spring-boot-starter 核心 starter, spring-context, spring-beans
spring-boot-starter-actuator 管理和监控应用
spring-boot-starter-web web 开发支持,包含 tomcat 和 spring-mvc
spring-boot-starter-test 常用框架 Junit, Hamcrest,Mockito 支持
spring-boot-starter-aop spring-aop, aspectjrt, aspectjweaver, 支持面向切面编程
spring-boot-starter-data-jpa 支持 JPA,包含 spring-data-jpa, spring-orm 和 Hibernate
spring-boot-starter-data-jpa 支持 JPA,包含 spring-data-jpa, spring-orm 和 Hibernate
spring-boot-starter-logging logback-classic, jcl-over-slf4j, jul-to-slf4j, spring boot 默认框架 lockback
spring-boot-starter-log4j log4j2, log4j-slf4j-impl,Log4j 日志框架
spring-boot-starter-security spring-security-web, spring-security-config,授权认证支持

Spring Boot 自动配置

Spring Boot 通过 @EnableAutoConfiguration 注解来开启自动配置,它会自动扫描类路径 jar 包,类来注册到 spring bean 中。

Spring Boot 自动配置的逻辑在 spring-boot-autoconfigure.jar 中,在这里可以查看 spring boot 做了哪些自动配置。

1.png

如 spring aop 的自动配置如下:

@Configuration(proxyBeanMethods = false)
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnClass(Advice.class)
    static class AspectJAutoProxyingConfiguration {

        @Configuration(proxyBeanMethods = false)
        @EnableAspectJAutoProxy(proxyTargetClass = false)
        @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false",
                matchIfMissing = false)
        static class JdkDynamicAutoProxyConfiguration {

        }

        @Configuration(proxyBeanMethods = false)
        @EnableAspectJAutoProxy(proxyTargetClass = true)
        @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
                matchIfMissing = true)
        static class CglibAutoProxyConfiguration {

        }

    }

    @Configuration(proxyBeanMethods = false)
    @ConditionalOnMissingClass("org.aspectj.weaver.Advice")
    @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true",
            matchIfMissing = true)
    static class ClassProxyingConfiguration {

        ClassProxyingConfiguration(BeanFactory beanFactory) {
            if (beanFactory instanceof BeanDefinitionRegistry) {
                BeanDefinitionRegistry registry = (BeanDefinitionRegistry) beanFactory;
                AopConfigUtils.registerAutoProxyCreatorIfNecessary(registry);
                AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
            }
        }

    }

}

spring boot是通过条件注解来实现自动配置的,注意上面的 Conditional 开头的注解,它们的含义是:

  • @ConditionalOnProperty: 指定的属性是否有指定的值
  • @ConditionalOnClass: 当类路径下有指定的类条件下
  • @ConditionalOnMissingClass:当类路径下没有指定的类条件下

还有其他类似的注解,都是表示在什么条件下才生效的意思。

内置 Servlet 容器

Spring Boot 默认使用内置的 Tomcat 容器,无需复杂的基础设施配置就能独立运行一个 web 应用。 当然你可以选择使用其他的 servlet 容器比如 Jetty, 只需要在 pom 文件中排除 tomcat 依赖引入 jetty 依赖即可。

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <exclusions>
        <exclusion>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-tomcat</artifactId>
        </exclusion>
    </exclusions>
</dependency>
 
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-jetty</artifactId>
</dependency>

启动 Spring Boot 应用

Spring Boot 通过一个名为 *Application.java 的入口类来启动

@SpringBootApplication
public class MyApplication {
    public static void main(String[] args) {
        SpringApplication.run(MyApplication.class, args);
    }
}

注意到上面的@SpringBootApplication 注解 ,其实包含了@Configuration, @EnableAutoConfiguration 和 @ComponentScan 这几个注解:

  • @Configuration:表明一个类是配置类
  • @EnableAutoConfiguration:开启自动配置
  • @ComponentScan:把符合扫描规则的类装配到spring容器,对应 xml 中 的 ==<context:component-scan>==

执行 main 方法会读取 application.properties 文件属性内容进行配置来启动应用程序。

application.properties

# Servlet 容器配置
# 端口
server.port=8080
# context
server.contextPath=/api

参考链接:

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,189评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,577评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,857评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,703评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,705评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,620评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,995评论 3 396
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,656评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,898评论 1 298
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,639评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,720评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,395评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,982评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,953评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,195评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,907评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,472评论 2 342