Spring项目结构
- 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,张卫滨