写点什么

SpringBoot 系列(2)- 第一个 SpringBoot 程序

用户头像
引花眠
关注
发布于: 2020 年 09 月 27 日

项目初始化

之前也介绍过使用 SpringBoot 构建应用是非常快速的,我们通过使用 SpringBoot Initializr 来构建项目结构以及依赖,SpringBoot Initializr 的使用方式由以下几种:

  • 使用 Web 网站构建,其地址为start

  • 使用 Spring Tool Suite 构建

  • 使用 IntelliJ IDEA

  • 使用 SpringBoot CLI springboot 提供的一个命令行工具,可以方便的构建项目

使用 Web 界面初始化

我们访问https://start.spring.io/,可以看到最新的构建页面,不同时期的页面可能不同,但大致项目相同


  1. Project 可以选择使用 Maven 或 Gradle 构建项目

  2. Language 选择开发语言,SpringBooot 支持三种:Java、Kotlin、Groovy

  3. SpringBoot 选择 SpringBoot 版本,之前最新的稳定版本是 2.1.5

  4. Project Metadata 项目元数据,Group、Artifact 等,这里我们选择

  5. Dependencies 起步依赖,这是 SpringBoot 能帮我们节省配置时间的关键,在后续我们会进行介绍,这里我们选择 Web 和 DevTools

  6. 点击生成,其会帮我们生成一个 zip 包,其中格式为:



ps:其中有一些是 Eclipse 生成的文件,比如.settings.classpath


使用 BootCli 进行初始化

Spring Boot CLI 是一个命令行工具,能使你快速的初始化 SpringBoot。其使用也非常简单,从 SpringBoot 官网下载Spring Boot CLI,并解压安装,在其 bin 目录有两个文件springspring.bat脚本文件,我们可以通过运行它们来构建项目,比如对于上述的项目,我们使用以下命令将达到同样的效果:

spring init -dweb,devtools --build maven -p war demo

init 使用 Spring Initializr 初始化一个项目

-d参数 以逗号为分隔符的依赖

--build参数 构建系统,默认为 maven,可选 gradle

-p参数 表示项目的包,比如 jar、war

我们可以使用spring --help init来查看帮助

运行 SpringBoot

项目内容

启动类

DemoApplication 是启动类,直接运行就可以

package com.example.demo;
import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplicationpublic class DemoApplication {
public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); }
}
复制代码
  • @SpringBootApplication注解 开启了启动扫描和自动配置功能,它包含三个注解

  • SpringApplication.run(DemoApplication.class, args) 启动引导 Spring 程序。DemoApplication 是最重要的配置类

当我们启动程序之后,会启动一个监听 8080 端口的 Tomcat 服务器,不过直接访问会报错。


配置文件

默认下载的项目中配置文件使用的 applicaiton.properties,现在将其替换为 application.yml,现在文件为空,暂时没有任何内容,我们可以在配置文件中进行很多配置,但是暂时我们可以测试的好像也就只有 Tomcat 的端口号,我们将其调整为 9000:

server:   port: 9000
复制代码

yml 文件的配置方式与 properties 文件不同,如果是上述配置,在 applicaiton.properties 中为:

server.port=9000 
复制代码

测试类

下载下来的项目文件中,还有一个测试模板:

package com.example.demo;
import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)@SpringBootTestpublic class DemoApplicationTests {
@Test public void contextLoads() { }
}
复制代码
  1. SpringRunner 如果我们使用的是 Junit4,则必须使用

  2. @SpringBootTest表名当前类是基于 SpringBoot 的测试类,可以指定启动类,它自动扫描@SpringBootConfiguration注解的类,所以它能扫描的 DemoApplication 类

SpringBoot 的构建过程解析

通过上述的项目文件,我们发现 Spring Boot 与普通的 Spring 没有什么本质的差别,那么它是怎么达到自动加载依赖的功能呢,答案就在其构建文件中(Gradle 的 build.gradle,Maven 的 pom.xml),我们使用的是 Maven,所以我们可以看一下:

<?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-starter-parent</artifactId>        <version>2.1.5.RELEASE</version>        <relativePath/> <!-- lookup parent from repository -->    </parent>    <groupId>com.example</groupId>    <artifactId>demo</artifactId>    <version>0.0.1-SNAPSHOT</version>    <name>demo</name>    <description>Demo project for Spring Boot</description>
<properties> <java.version>1.8</java.version> </properties>
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency>
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <scope>runtime</scope> <optional>true</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies>
<build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build>
</project>
复制代码

从 pom.xml 文件中,我们发看到有别于其他项目的配置

  1. 设置其 parent 指向了org.springframework.boot:spring-boot-starter-parent

  2. 增加了一个插件org.springframework.boot:spring-boot-maven-plugin

  3. 所有的依赖都没有设置版本

Demo 项目将spring-boot-starter-parent作为父项目,就可以从其中继承很多常用依赖的版本(其实际配置是在spring-boot-dependencies中设置的),所以可以不用设置版本号。

这样的好处

想想在没有这种依赖管理的之前,如果项目需要依赖包我们会怎么做:

从 Maven Repository 中搜索需要用到的依赖

复制到 pom.xml 中

跳转到 1,然后继续,直到找到所需要的依赖

构建项目,如果依赖的版本之间没有冲突,啊哈,运气,如果有冲突那就去网上搜索解决办法

依赖没有问题(不容易)

这还是在你写业务代码之前要做的工作,想想是不是很繁琐,关键是在你没开始写代码之前,你不确定这是正确的。

自动依赖管理的本质

maven 本身具有依赖管理的功能,上文也说了,所有的常用依赖都是在spring-boot-dependencies-*.pom中设置的,我们打开``看一下,重点看一下 dependencyManagement 标签:

  ...<dependencyManagement>    <dependencies>      <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot</artifactId>        <version>2.1.5.RELEASE</version>      </dependency>      ...      <dependency>        <groupId>org.slf4j</groupId>        <artifactId>slf4j-api</artifactId>        <version>${slf4j.version}</version>      </dependency>      ...   </dependencies> <dependencyManagement>     ...
复制代码

ps:dependencyManagement的作用是声明依赖及版本,并不会实际引入依赖,因此子项目需要显示的声明需要用的依赖。如果不在子项目中声明依赖,是不会从父项目中继承下来的;只有在子项目中写了该依赖项,并且没有指定具体版本,才会从父项目中继承该项,并且 version 和 scope 都读取自父 pom;另外如果子项目中指定了版本号,那么会使用子项目中指定的 jar 版本。

dependencies的作用是声明并引入依赖,即使子项目中不声明该依赖,子项目也会引入父项目中的所有依赖。

使用其他版本代替传入的依赖

比如说在现在的项目中,我们会自动依赖,其版本为,如果我们要换版本比如说将其换成,那么我们可以直接在 pom.xml 中进行调整

<dependency>    <groupId>org.slf4j</groupId>    <artifactId>slf4j-api</artifactId>    <version>1.7.26</version></dependency>
复制代码

运行 SpringBoot 程序

我们可以通过使用 IDE 中的在DemoApplication.java上选择run as -> Java Application来运行该程序。


这就是运行之后的效果,当然因为我们任何业务代码都没有写,所有访问项目时会出现默认的 404 页面。

参考

  1. YAML介绍


发布于: 2020 年 09 月 27 日阅读数: 780
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

发布
暂无评论
SpringBoot系列(2)-第一个SpringBoot程序