首页
学习
活动
专区
工具
TVP
发布

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

项目初始化

之前也介绍过使用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介绍
  • 发表于:
  • 本文为 InfoQ 中文站特供稿件
  • 首发地址https://www.infoq.cn/article/a417ffd8a51564d6cb6f09a36
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券