写点什么

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;
@SpringBootApplication
public 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)
@SpringBootTest
public 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 日阅读数: 772
用户头像

引花眠

关注

还未添加个人签名 2018.06.11 加入

还未添加个人简介

评论

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