Spring-02:构建并运行基础Spring应用
Spring项目结构
①pom.xml
maven的构建规范
②mvnw和mvnw.cmd
这是Maven包装器脚本,借助它,即使没有安装maven也可以构建项目。
③TacoCloudApplicationTests
这是简单的测试类,确保Spring应用上下文可以成功加载
④application.properties
提供指定配置属性的地方
⑤templates
渲染内容到浏览器的模板文件,如thymeleaf
⑥static
这个文件夹可以存放为浏览器提供服务的静态内容。css、js、图片等
⑦TacoCloudApplication.java
这是SpringBoot的主类,它会启动本项目
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 https://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.7.3</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>tacos</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>taco-cloud</name>
<description>taco-cloud</description>
<properties>
<project.build.sourceEncoding>
UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>
UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<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.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.13.1</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-test</artifactId>
<version>2.5.2</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>5.3.8</version>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.3</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
①spring-boot-starter依赖
<parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.3</version> <relativePath/> <!-- lookup parent from repository --> </parent>
本项目以spring-boot-starter-parent作为其父POM,为Spring项目常见的一些库提供了依赖管理,无需指定他们的版本。
三个包含starter单词的依赖,它们本身并不包含库代码,而是传递性地拉去其他的库。
②问题:Plugin ‘org..boot:spring-boot-maven-plugin:‘ not found
添加和上方一致的版本号即可
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.7.3</version>
③springboot插件的作用
提供maven goal,允许我们使用maven运行应用
确保依赖的库包含在可执行的jar中
将引导类TacoCloudApplication.java,声明为可执行jar的主类
主类中的结构
package com.example.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);
}
}
@SpingBootApplication注解
@SpingBootApplication包含
①@SpingBootConfiguration
将该类声明为配置类
后续可以按需添加spring款加配置(是@Configuration的特殊形式)
②@EnableAutoConfiguration
启用SpingBoot的自动配置
③@ComponentScan
启用组件扫描。扫描@Controller、@Service这些组件,自动注册为Spring应用中的上下文组件。
.run()方法
SpringApplication中的run方法被调用后,会创建Spring的上下文,它有两个参数:
TacoCloudApplication.class:配置类TacoCloudApplication对象
args:命令行参数
2 开始编写Spring应用
开始前需了解
现在,我们需要创建:
一个控制器类,用来处理主页相关请求
一个视图模板,用来界面层的展示
一个简单的测试类,用来测试主页
创建各组件
①主页控制器Controller
package com.example.tacos;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class HomeController {
@GetMapping("/")
public String home(){
return "home";
}
}
@Controller,标明此类为控制器组件。Spring的组件扫描功能会发现它并创建一个HomeController实例作为Spring上下文中的bean
@GetMapping("/")处理前端传来的根路径为"/"的请求:比如针对"/"发送的HTTP GET请求,这个方法将会处理请求,返回String类型的“home”值
关于返回的“home”值
这个值会被解析为视图的逻辑名,使用到了thymeleaf。
之前在Javaweb的学习中,在web.xml中配置过上下文参数
<!-- 配置上下文参数 -->
<context-param>
<param-name>view-prefix</param-name>
<param-value>/</param-value>
</context-param>
<context-param>
<param-name>view-suffix</param-name>
<param-value>.html</param-value>
</context-param>
现在的前缀是“/template/”,后缀还是“.html”
②定义视图层
home.html
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org">
<head>
<title>Taco Cloud</title>
</head>
<body>
<h1>Welcome to...</h1>
<img th:src="@{/images/TacoCloud.png}"/>
</body>
</html>
③创建测试控制器
@RunWith(SpringRunner.class)
@WebMvcTest(HomeController.class) // <1>
public class HomeControllerTest {
@Autowired
private MockMvc mockMvc; // <2>
@Test
public void testHomePage() throws Exception {
mockMvc.perform(get("/")) // <3>
.andExpect(status().isOk()) // <4>
.andExpect(view().name("home")) // <5>
.andExpect(content().string( // <6>
containsString("Welcome to...")));
}
}
<1>针对controller的web测试
<2>注入mockMvc,可以让测试实现mockup
<3>发起对“/”的GET请求
<4>期望的状态是200
<5>跳转home页面视图
<6>期望包含“Welcome to..."
该测试类若通过测试,证明我们刚才写的视图层和控制层的组件都完成了预期任务。
3 运行Spring应用
通过以上内容我们已经编写好了一个简单的Spring的应用,现在使用IDEA来运行它。运行后如下图所示:
①在左上方IDEA的运行工具中,点击edit configuration来配置我们要运行的应用;
②可以看到我们选择的应用程序名称和我们的主类(引导类)TacoCloudApplication名称是相同的;
③为什么没有显示我们之前学习Javaweb时,启动项目都会出现的Tomcat图标?因为Spring Boot应用里已经包含了Tomcat,现在我们启动Spring项目,里面就启动了Tomcat,图中显示Tomcat已经在端口8080启动的日志,它是我们应用的一部分;
④在浏览器中通过访问http://localhost:8080/,看到我们的home页面,就表示运行成功了。
以上我们完成了一个简单的Spring应用,并成功运行了它。
- 接下来我们还会介绍③中使用的Devtools工具;
- 对接数据库来访问持久层的数据;
- 不断丰富扩展我们的应用,学习更多Spring知识。
参考资料:
《Spring实战第5版》