欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

《Spring in Action》第1章-开始使用Spring

程序员文章站 2024-02-15 10:59:34
...

开始使用Spring


1、构建一个Spring应用

使用Spring Initializr构建应用:

2、构建后的应用结构

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

《Spring in Action》第1章-开始使用Spring

生成的项目结构如下:

《Spring in Action》第1章-开始使用Spring

  • 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包目录结构如下:

    《Spring in Action》第1章-开始使用Spring

    只有项目相关的代码和资源,没有依赖包,执行这个jar包包下面的错误:
    《Spring in Action》第1章-开始使用Spring
    加上插件后的jar包目录结构:

    《Spring in Action》第1章-开始使用Spring

    在BOOT-INF目录下,不仅有项目代码和资源,还有所有的依赖包:
    《Spring in Action》第1章-开始使用Spring

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 in Action》第1章-开始使用Spring

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 (参考自博客:https://blog.csdn.net/wjc475869/article/details/52442484)

  • 应用自动重启:

    当DevTools在项目中起作用时,应用将在JVM中被加载进两个独立的类加载器中。一个类加载器加载我们项目下/src/main/目录下的任何资源;另一个加载器加载项目的依赖包。当改变被探测到,DevTools只重新加载第一个类加载器并重启Spring应用上下文,另一个类加载器不会被重新加载。

  • 浏览器自动刷新和关闭模板缓存

    当我们修改了以浏览器为目标的资源后,只需要刷新页面便可看到改变。我们还可以为浏览器添加LiveReload插件,这样我们连刷新按钮都不用按(当DevTools起作用时,项目启动时会同时启动一个LiveReload服务)。

  • 内置H2控制台

    当我们在开发时使用H2数据库,DevTools会自动开启一个H2控制台,我们通过浏览器访问http://localhost:8080/h2-console来查看数据库的记录。

相关标签: spring

上一篇: MySQL快速入门指南(1)

下一篇: