开始使用Spring


1、构建一个Spring应用

使用Spring Initializr构建应用:

2、构建后的应用结构

在构建项目时我们选择以下的依赖:

spring boot项目common_html

生成的项目结构如下:

spring boot项目common_spring boot项目common_02

  • mvnw和mvnw.cmd是maven的打包脚本,及时我们没有安装maven,也可以用这个脚本来构建项目。
  • TacoCloudApplication.java是Spring Boot的主类,它会引导项目运行。

pom.xml中:

<build>
    <plugins>
 	   <plugin>
 		   <groupId>org.springframework.boot</groupId>
 		   <artifactId>spring-boot-maven-plugin</artifactId>
 	   </plugin>
    </plugins>
 </build>

这是一个Spring Boot插件,它有一下几个重要功能:

  • 它提供了一个Maven目标:允许我们使用Maven运行项目
  • 它确保所有的依赖都被包含在可执行jar包中,且在运行时classpath中可用
  • 生成一个manifest文件,指定程序引导类(TacoCloudApplication.java)为可执行jar包的主类。
    如果没有加这个插件,构建的项目jar包目录结构如下:

只有项目相关的代码和资源,没有依赖包,执行这个jar包包下面的错误:

spring boot项目common_spring_03


加上插件后的jar包目录结构:

spring boot项目common_html_04

在BOOT-INF目录下,不仅有项目代码和资源,还有所有的依赖包:

spring boot项目common_spring boot项目common_05

3、程序引导类

package tacos;

 import org.springframework.boot.SpringApplication;
 import org.springframework.boot.autoconfigure.SpringBootApplication;

 @SpringBootApplication
 public class TacoCloudApplication {

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

 }

最简洁最重要的一行代码-@SpringBootApplication,这个注解是一个综合注解,它包含其它三个注解:

  • @SpringBootConfiguration:定义这个类为一个配置类,可以在这个类中编写基于java的配置代码。改注解是@Configuration的一个特殊形式。
  • @EnableAutoConfiguration:允许Spring Boot自动配置。
  • @ComponentScan:允许扫描组件。这将允许我们使用@Controller,@Service@Component等注解。

另一个重要的代码块-main方法:这是一个样板代码,在jar文件运行是,这个方法被调用。该方法调用了静态方法run,该方法完成真正的应用程序引导,创建Spring应用的上下文。该方法接收两个参数:一个是配置类,一个是命令行参数。虽然配置类不一定必须是引导类,但是将引导类传给run方法是一个非常方便且典型的选择。

4、处理Web请求

Spring MVC 是一个非常强大的Web框架,它的中心理念就是controller,controller类负责处理请求并返回数据。

一个简单的controller类:

@Controller
 public class HomeController {

    @GetMapping("/")
    public String home(){
 	   return "home";
    }
 }
  • @Controller注解的主要作用就是声明该类为已个组件,以供容器自动扫描。@Component,@Service@Repository功能也一样,上面使用这3个注解效果一样,但是使用@Controller可以描述这个类在应用中的职责。
  • @GetMapping注解的home方法将处理根路径为"/"的HTTP GET请求。home方法返回一个字符串,这个字符串将会被解释为一个视图的逻辑名
  • 因为我们使用了Thymeleaf模板引擎,所以我们可以使用Thymeleaf来定义视图模板。模板的名字由逻辑名加上前缀/templates/和后缀.html派生而来,所以我们应该在/src/main/resources/templates中创建一个名为home.html的模板。

编写视图模板:

<!DOCTYPE html>
 <html xmlns="http://www.w3.org/1999/xhtml"
 	 xmlns:th="http://www.thymeleaf.org">
 <head>
    <meta charset="UTF-8">
    <title>Taco Cloud</title>
 </head>
 <body>
    <h1>Welcom to</h1>
    <img th:src="@{/images/TacoCloud.jpg}">
 </body>
 </html>

<img/>标签中,使用了Thymeleaf的th:src元素和@{}表达式来引用图片。图片应该被放在/src/main/resources/static/images/目录下。

编写一个测试用例用来测试controller:

import static org.hamcrest.Matchers.containsString;
 import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.content;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status;
 import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.view;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
 import org.springframework.test.context.junit4.SpringRunner;
 import org.springframework.test.web.servlet.MockMvc;
 import tacos.controller.HomeController;

 @RunWith(SpringRunner.class)
 @WebMvcTest(HomeController.class) //HomeController的web测试
 public class ControllerTest {
    @Autowired
    private MockMvc mockMvc; //注入MockMvc
    @Test
    public void testHomePage() throws Exception{
 	   mockMvc.perform(get("/")) //执行HTTP GET 请求
 			   .andExpect(status().isOk()) //期望请求状态未200
 			   .andExpect(view().name("home"))//期望返回的视图名为home
 			   .andExpect(content().string(containsString("Welcome to ...")));//期待视图模板中包含Welcome to ... 字符串
    }
 }
  • @WebMvcTest:Spring Boot提供的注解,这个注解将测试放置在Spring MVC应用上下文中运行;上面的测试中,还将HomeController注册在Spring MVC中,这样我们才能对其进行请求。

我们运行这个测试类,如果所有的结果符合预期的话,测试通过,在idea中的图标可能是这样的:

spring boot项目common_spring_06

5、Spring Boot DevTools

DevTools提供了非常方便的开发时工具:
* 当代码改变时,自动重启应用
* 当以浏览器为目标的资源改变时,自动刷新页面
* 自动关闭模板缓存
* 如果H2在用,内置H2控制台

在使用Intellij idea进行开发时,尽管依赖了DevTools,但是不起作用,此时需要对idea进行设置:File>settings>Build,Execution,Deployment>Compiler 下选中Build Project Automatically,然后Shift+Ctrl+Alt+/,选择Registry,选中compile.automake.when.app.running (参考自博客:)

  • 应用自动重启:
    当DevTools在项目中起作用时,应用将在JVM中被加载进两个独立的类加载器中。一个类加载器加载我们项目下/src/main/目录下的任何资源;另一个加载器加载项目的依赖包。当改变被探测到,DevTools只重新加载第一个类加载器并重启Spring应用上下文,另一个类加载器不会被重新加载。
  • 浏览器自动刷新和关闭模板缓存
    当我们修改了以浏览器为目标的资源后,只需要刷新页面便可看到改变。我们还可以为浏览器添加LiveReload插件,这样我们连刷新按钮都不用按(当DevTools起作用时,项目启动时会同时启动一个LiveReload服务)。
  • 内置H2控制台
    当我们在开发时使用H2数据库,DevTools会自动开启一个H2控制台,我们通过浏览器访问http://localhost:8080/h2-console来查看数据库的记录。