Spring Boot快速入门

Spring Boot 概述

Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-based applications. Spring Boot is designed to get you up and running as quickly as possible, with minimal upfront configuration of Spring.

引自官网的一段话,大概是说:Spring Boot是所有基于Spring开发的项目的起点。Spring Boot的设计是为了让你尽可能快的跑起来 Spring 应用程序并且尽可能减少你的配置文件。

优势:简单、快速、方便地搭建项目;对主流开发框架的无配置集成;极大提高了开发、部署效率。

Spring Boot 快速搭建

新建项目

New -> Project -> Spring Initializr -> 选择默认的url -> 配置项目信息Group和Artifact -> Dependencies选择Web,并勾选上Web模板 -> 选择好项目位置

建议勾选的依赖:

  • Web -> Web
  • Template -> Freemaker
  • SQL -> MySQL
  • SQL ->MyBatis

如果是第一次配置Spring Boot可能需要等待一会IDEA下载相应的依赖包,默认创建好的项目结构如下:

  • SpringbootApplication:一个带有 main()方法的类,用于启动应用程序
  • SpringbootApplicationTests:一个空的Junit测试类,它加载了一个使用Spring Boot字典配置功能的Spring应用程序上下文
  • application.properties:一个空的properties文件,可以根据需要添加配置属性
  • pom.xml:Maven构建说明文件

目录结果

Spring Boot建议的目录结果如下:

com
  +- example
    +- myproject
      +- Application.java
      |
      +- model
      |  +- Customer.java
      |  +- CustomerRepository.java
      |
      +- service
      |  +- CustomerService.java
      |
      +- controller
      |  +- CustomerController.java
      |
  1. Application.java 建议放到根目录下面,主要用于做一些框架配置
  2. model 目录主要用于实体与数据访问层(Repository)
  3. service 层主要是业务类代码
  4. controller 负责页面访问控制

引入 web 模块

pom.xml中添加支持web的模块:

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

pom.xml 文件中默认有两个模块:

  • spring-boot-starter:核心模块,包括自动配置支持、日志和 YAML,如果引入了spring-boot-starter-web,web 模块可以去掉此配置,因为spring-boot-starter-web自动依赖了spring-boot-starter
  • spring-boot-starter-test:测试模块,包括 JUnit、Hamcrest、Mockito

HelloController

package cn.appblog.springboot;

import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    @RequestMapping("/hello")
    public String hello() {
        return "Hello Spring Boot!";
    }

}

@RestController 注解:该注解是 @Controller 和 @ResponseBody 注解的合体版

利用 IDEA 启动 Spring Boot

回到SpringbootApplication这个类中,然后右键点击Run 'SpringbootApplication'运行:

注意:之所以在上面的项目中没有手动的去配置Tomcat服务器,是因为Spring Boot内置了Tomcat

等待一会儿就会看到下方的成功运行的提示信息:

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/
 :: Spring Boot ::        (v2.1.3.RELEASE)

...
Tomcat started on port(s): 8080 (http) with context path ''
Started SpringbootApplication in 2.711 seconds (JVM running for 4.294)
Initializing Spring DispatcherServlet 'dispatcherServlet'
Initializing Servlet 'dispatcherServlet'
Completed initialization in 10 ms

可以看到Tomcat运行在8080端口,访问/hello地址即可:http://localhost:8080/hello

单元测试

打开的src/test/下的测试入口,编写简单的 http 请求来测试;使用 mockmvc 进行,利用MockMvcResultHandlers.print()打印出执行结果。

import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import static org.hamcrest.Matchers.equalTo;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;

@SpringBootTest
@RunWith(SpringRunner.class)
public class HelloTest {
    private MockMvc mvc;

    @Before
    public void setUp() throws Exception {
        mvc = MockMvcBuilders.standaloneSetup(new HelloController()).build();
    }

    @Test
    public void getHello() throws Exception {
        mvc.perform(MockMvcRequestBuilders.get("/hello").accept(MediaType.APPLICATION_JSON))
                .andExpect(status().isOk())
                .andExpect(content().string(equalTo("Hello World")));
    }
}

解析Spring Boot项目

解析 pom.xml 文件

默认生成的pom.xml文件中可以看到一个比较陌生的标签<parent>,这个标签是在配置Spring Boot的父级依赖:

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

有了这个配置,当前的项目才是Spring Boot项目,spring-boot-starter-parent是一个特殊的starter,它用来提供相关的Maven默认依赖,使用它之后,常用的包依赖就可以省去version标签

关于具体Spring Boot提供了哪些jar包的依赖,我们可以查看本地Maven仓库下:\repository\org\springframework\boot\spring-boot-dependencies\2.1.3.RELEASE\spring-boot-dependencies-2.1.3.RELEASE.pom文件来查看

应用入口类

Spring Boot项目通常有一个名为 *Application 的入口类,入口类里有一个main方法, 这个main方法其实就是一个标准的Java应用的入口方法。

@SpringBootApplication是Spring Boot的核心注解,它是一个组合注解,该注解组合了:@Configuration@EnableAutoConfiguration@ComponentScan;若不是用 @SpringBootApplication注解也可以使用这三个注解代替。

其中,@EnableAutoConfiguration让Spring Boot根据类路径中的jar包依赖为当前项目进行自动配置,例如,添加了spring-boot-starter-web依赖,会自动添加Tomcat和Spring MVC的依赖,那么Spring Boot会对Tomcat和Spring MVC进行自动配置。
Spring Boot还会自动扫描@SpringBootApplication所在类的同级包以及下级包里的Bean,所以入口类建议就配置在grounpID + arctifactID组合的包名下(这里为 cn.appblog.springboot 包)

Spring Boot的配置文件

application.propertiesapplication.yml

Spring Boot使用一个全局的配置文件application.propertiesapplication.yml,放置在src/main/resources目录或者类路径的/config下。

Spring Boot不仅支持常规的properties配置文件,还支持yaml语言的配置文件。yaml是以数据为中心的语言,在配置数据的时候具有面向对象的特征。

Spring Boot的全局配置文件的作用是对一些默认配置的配置值进行修改

例如同样将Tomcat默认端口设置为8080,并将默认的访问路径从/修改为/hello时,使用properties文件和yml文件的区别:

application.properties

server.port=8080
server.servlet.context-path=/appblog

application.yml

server:
  port: 8080
  servlet:
    context-path: /appblog

重启Spring Boot,输入URL:http://localhost:8080/appblog/hello

注意:yml需要在:后加一个空格,幸好IDEA很好地支持了yml文件的格式有良好的代码提示

配置多个属性

我们直接把.properties后缀的文件删掉,使用.yml文件来进行简单的配置,然后使用@Value来获取配置属性:

server:
  port: 8080
  servlet:
    context-path: /
name: Joe.Ye
age: 28
@RestController
public class HelloController {

    @Value("${name}")
    private String name;

    @Value("${age}")
    private Integer age;

    @RequestMapping("/hello")
    public String hello() {
        return "name:" + name + ", " + "age:" + age;
    }
}

重启Spring Boot,输入URL:http://localhost:8080/hello

也可以在配置文件中使用当前配置:

server:
  port: 8080
  servlet:
    context-path: /
name: Joe.Ye
age: 28
content: "name:${name}, age:${age}"
@RestController
public class HelloController {

    @Value("${content}")
    private String content;

    @RequestMapping("/hello")
    public String hello() {
        return content;
    }
}

封装配置信息

问题:如上写配置文件繁琐而且可能会造成类的臃肿,因为有许许多多的@Value注解。

我们可以把配置信息封装成一个类,首先在我们的nameage前加一个person前缀,然后新建一个Person类用来封装这些信息,并用上两个注解:

  • @Component:表明当前类是一个Java Bean
  • @ConfigurationProperties(prefix = "person"):表示获取前缀为person的配置信息
server:
  port: 8080
  servlet:
    context-path: /
person:
  name: Joe.Ye
  age: 28
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
    private String name;
    private Integer age;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }
}
@RestController
public class HelloController {

    @Autowired
    private Person person;

    @RequestMapping("/hello")
    public String hello() {
        return "name:" + person.getName() + ", age:" + person.getAge();
    }
}

Spring Boot热部署

IDEA配置热部署

(1)File -> Settings -> Compiler -> 勾选Build project automatically
(2)快捷键Ctrl+Shift+Alt+/ -> 选中Registry -> 勾选compiler.automake.allow.when.app.running
(3)重启IDEA
(4)Chrome浏览器中按F12 -> Disable cache

Spring Boot配置热部署

在目前的Spring Boot项目中,当发生任何修改之后我们都需要重新启动才能够查看效果,这样会略显麻烦,Spring Boot提供了热部署的方式,当发现任何类发生改变,就会通过JVM类加载的方式,加载最新的类到虚拟机中,不需要重启也能看到修改后的效果。

pom.xml中添加一个依赖即可:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-devtools</artifactId>
    <optional>true</optional> <!-- 需要为true热部署才有效 -->
</dependency>

重新启动Spring Boot,然后修改任意代码,就能观察到控制台的自动重启现象。

Spring Boot使用

Spring Boot支持JSP

Spring Boot的默认视图支持是Thymeleaf模板引擎,我们还是想要使用JSP怎么办呢?

(1)修改pom.xml增加对JSP文件的支持

<!-- servlet依赖. -->
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>javax.servlet-api</artifactId>
    <scope>provided</scope>
</dependency>
<dependency>
    <groupId>javax.servlet</groupId>
    <artifactId>jstl</artifactId>
</dependency>

<!-- tomcat的支持.-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-tomcat</artifactId>
    <!--<scope>provided</scope>-->
</dependency>
<dependency>
    <groupId>org.apache.tomcat.embed</groupId>
    <artifactId>tomcat-embed-jasper</artifactId>
    <scope>provided</scope>
</dependency>

(2)配置试图重定向JSP文件的位置

修改application.yml文件,将JSP文件重定向到/WEB-INF/views/目录下:

spring:
  mvc:
    view:
      prefix: /WEB-INF/views/
      suffix: .jsp

(3)修改 HelloController

修改@RestController注解为@Controller,然后将hello方法修改为:

(4)新建 hello.jsp 文件

src/main目录下依次创建webapp/WEB-INF/views目录,并创建一个hello.jsp文件:

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
Hello, Joe.Ye. 现在时间是${now}

(5)热部署完毕刷新网页

若报如下错误:

Whitelabel Error Page
This application has no explicit mapping for /error, so you are seeing this as a fallback.

Fri Mar 08 17:13:32 CST 2019
There was an unexpected error (type=Not Found, status=404).
No message available

则停止运行应用,再使用Maven插件spring-boot:run(Plugins -> spring-boot -> spring-boot:run)运行项目可以解决

修改Spring Boot内嵌Tomcat运行环境

@Bean
public WebServerFactoryCustomizer webServerFactoryCustomizer(){
    return new WebServerFactoryCustomizer<ConfigurableServletWebServerFactory>() {
        @Override
        public void customize(ConfigurableServletWebServerFactory factory) {
            factory.setPort(8090);  //默认8080
            factory.setDocumentRoot(new File("src/main/appblog"));  //默认src/main/webapp
        }
    };
}

版权声明:
作者:Joe.Ye
链接:https://www.appblog.cn/index.php/2023/04/01/spring-boot-quick-start/
来源:APP全栈技术分享
文章版权归作者所有,未经允许请勿转载。

THE END
分享
二维码
打赏
海报
Spring Boot快速入门
Spring Boot 概述 Build Anything with Spring Boot:Spring Boot is the starting point for building all Spring-based applications. Spring Boot is desi……
<<上一篇
下一篇>>
文章目录
关闭
目 录