Spring in action. Spring起步

196 阅读4分钟

Spring项目结构

image.png

  • mvnw和mvnw.cmd:这是Maven的包装器(wrapper)脚本。借助这些脚本,即便你的机器上没有安装Maven,也可以构建项目。
  • pom.xml:这是Maven构建规范。
  • TacoRepeatApplication.java:这是SpringBoot主类,它会启动该项目。
  • application.properties:这个文件起初是空的,但是他为我们提供了指定配置属性的地方
  • static:在这个文件夹下,你可以存放任意为浏览器提供服务的静态内容(图片、样式表、Javascript等),该文件夹初始为空。
  • template:这个文件夹中存放用来渲染内容到浏览器的模板文件。这个文件夹初始是空的,后续会为其中添加Thymeleaf模板。
  • TacoRepeatApplicationTests.java:这是一个简单的测试类,它能确保Spring应用上下文可以成功加载

pom.xml -构建规范

<groupId>jay.taco</groupId>
<artifactId>taco-repeat</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>taco-repeat</name>
<description>Demo project for Spring Boot</description>
  • 打包格式有两种,jar和war

    传统的Javaweb应用都是打包成war文件,jar只是用来打包库和较为少见的桌面UI应用的,打包jar文件是基于云思维做出的选择,以为所有的Java云平台都能够运行可执行的jar文件。

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.7.1</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>
  • parent,指明父pom

指明父pom(spring-boot-starter-parent),且它可以为项目常用的一些库提供依赖管理,这里质指定了2.7.1表明会使用spirngboot2.7.1,会根据这个版本来继承依赖管理

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-xxxxx</artifactId>
</dependency>
  • artifactId里面的starter
    • 易于管理
    • 不用担心版本问题,会跟随前面的springboot版本
<build>
    <plugins>
        <plugin>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-maven-plugin</artifactId>
        </plugin>
    </plugins>
</build>
  • Springboot插件,它提供了一些重要的功能
    • 它提供了一个Maven goal,允许我们使用maven来构建项目。
    • 它会确保依赖的所有库都包含在可执行jar文件中,并且能够保证它们在运行时类路径下是可用的。
    • 它会在jar中生成一个manifest文件,将引导类(TacoRepeatAppliction)声明为可执行jar的主类。

引导应用 TacoRepeatApplication

@SpringBootApplication
public class TacoRepeatApplication {

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

}
  • @SpringBoot注解表明这是一个SpringBoot应用,它是一个组合注解(组合了其他三个注解)
    • @SpringBootConfiguration:将该类声明为配置类,(该注解实际上是@Configuration注解的特殊形式
    • @EnableAutoConfiguration:启用SpringBoot的自动配置
    • @ComponentScan:启用组建扫描。这样我们可以通过像@Component、@Controller、@Service这样的注解声明其他类,Spring会自动发现它们并将它们注册为Spring应用上下文中的组件。
  • main()方法

这个main()方法会调用SpringApplication中静态的run()方法。后者会真正执行应用的引导过程,也就是创建Spring的应用上下文。在传递给run()的两个参数中,一个是配置类,一个是命令行参数。

测试应用

//2.0.4 版本的spring有 @RunWith(SpringRunner.class)  -- 使用Spring的运行器
@SpringBootTest         //SpringBoot测试
class TacoRepeatApplicationTests {

    @Test   //测试方法
    void contextLoads() {
    }

}
  • @RunWith(SpringRunner.class)
    • @RunWith是JUnit的注解,它会提供一个测试运行器(SpringRunner)来指导JUnit如何来进行测试。而这个SpringRunner会创建测试时所需的Spring应用上下文。
  • @SpringBootTest
    • 它会告诉JUnit在启动测试的时候要添加上SpringBoot的功能。在下面的@Test方法就可以视同为 在main()方法中调用SpringApplication.run()。

编写Spring应用

处理web请求

@Controller
public class HomeController {

    @GetMapping("/")
    public String home(){
        return "home";
    }

}
  • @Controller:作用是让组件扫描将这个类识别为一个组件,故Spring的组件扫描功能会自动发现它,并创建一个HomeController实例作为Spring应用上下文中的bean。
    • 类似的注解有(@Component、@Service、@Repository)。可以为HomeController添加上述的任意注解,用@Controller只是更具有描述性

定义试图

<!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>Welcome to ...</h1>
<img th:src="@{/images/TacoCloud.png}"/>
</body>
</html>
  • 在html中引入thymeleaf
  • 关于图片的路径,这里写的是相对路径,前缀是图片的默认存储路径(/src/main/resources/static)

测试控制器

@RunWith(SpringRunner.class)
@WebMvcTest(HomeController.class)
public class HomeControllerTest {

    @Autowired
    private MockMvc mockMvc;

    @Test
    public void testHomePage() throws Exception {
        mockMvc.perform(get("/"))
                .andExpect(status().isOk())
                .andExpect(view().name("home"))
                .andExpect(content().string(
                        containsString("Welcome to ...")
                ));
    }
}
  • @WebMvcTest:这是一个特殊的注解,它会让这个测试在SpringMVC应用上下文中执行,简单来说就是它会将HomeController注册到SpringMVC中,这样的话我们就可以向他发送请求了。
  • 使用MockMvc来发送请求,并设置了我们期望返回,

回顾

  • 执行上述操作时的步骤
    • 使用Spring Initializr创建初始的项目结构
    • 编写控制器处理针对主页的请求
    • 定义了一个试图模板来渲染主页
    • 编写了一个简单的测试类来验证工作是否符合预期

--

简单理解Spring到底做了什么,首先看构建规范。
在pom.xml中,我们声明了对web和thymleaf starter的依赖。这两项依赖会传递引入大量其他的依赖,包括:

  • Spring的mvc框架;
  • 嵌入式的tomcat;
  • Thymleaf和Thymleaf布局方言;

它还引入了SpringBoot的自动配置库。当应用启动的时候,SpringBoot的自动配置会探测到这些库,并自动完成如下功能:

  • 在Spring应用上下文中配置bean以启用SpringMVC;
  • 在Spring应用上下文中配置嵌入式的Tomcat服务器;
  • 配置Thymleaf试图解析器,以便于使用Thymleaf模板渲染SpringMVC试图

--Spring 实战(第五版)Craig Walls,张卫滨