先放小结
- Spring旨在简化开发;
- Spring Boot构建在Spring之上,通过简化依赖管理、自动化配置和运行时洞察,使Spring更加易用;
- Spring应用程序可以使用Spring Initializr进行初始化。基于Web的应用,并且为大多数Java开发环境提供了原生支持;
- Sping应用上下文中,组件(Bean)可以使用Java或XML显式声明,也可以通过组件扫描发现,还可以使用SpringBoot自动配置功能实现自动化配置;
1.1 什么是Spring
Spring的核心是提供了一个容器,应用上下文(application context),它们会创建和管理应用组件(Bean)。通过依赖注入(dependency injection, DI)将Bean装配在一起。
- @Contiguration注解,告诉Spring这是一个配置类,会为Spring应用上下文提供bean。
- @Bean,配置类的方法用@Bean注解标注,表明这些方法返回的对象会以Bean的形式添加到Spring的应用上下文中。
1.2 初始化Spring应用
IntelliJ IDEA初始化Spring项目。
创建好之后,我们要导入Maven。
刚创建的项目,这里会是创建一个settings.xml,这是Maven的全局配置。
创建完后,复制以下代码
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<mirrors>
<mirror>
<id>alimaven</id>
<mirrorOf>central</mirrorOf>
<name>aliyun maven</name>
<url>http://maven.aliyun.com/nexus/content/repositories/central/</url>
</mirror>
</mirrors>
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<jdk>1.8</jdk>
</activation>
<repositories>
<repository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>nexus</id>
<name>local private nexus</name>
<url>http://maven.aliyun.com/nexus/content/groups/public/</url>
<releases>
<enabled>true</enabled>
</releases>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</profile>
</profiles>
</settings>
原本的设置是指向国外源的,现在我们将它指向阿里的国内源,下载依赖会快很多。
接下来还要修改一下pom.xml的依赖。
<?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.4.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<name>demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<project.build.sourceEncoding>
UTF-8</project.build.sourceEncoding>
<project.reporting.outputingEncoding>
UTF-8</project.reporting.outputingEncoding>
<java.version>11</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>
</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>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>htmlunit-driver</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.4.2</version>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
到这里,我们就配置好了,准备开始第一个简单的项目。
- @SpringBootApplication 是一个组合注解 ,包含以下三个:
- @SpringBootConfiguration 实际上就是@Configuration 的特殊形式
- @EnableAutoConfiguration 启动Spring Boot的自动配置
- @ComponentScan 启用组件扫描
1.3.1 处理Web请求
- 主页控制器
package com.example.demo;
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。
- home()是个控制器方法,带有@Getmapping注解,表明如果针对"/"发送HTTP GET请求,那么这个方法将会处理请求。
部署页面,使用Thymeleaf
模板名称是由逻辑视图名派生而来的,再加上"/templates/“前缀和”.html"后缀。最终形成模板路径"/templates/home.html"。所以我们把模板放到"src/main/resources/templates/home.html"目录中。
1.3.2 定义视图
<!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>
像图片这样的静态资源是放到"src/main/resources/static"文件夹中的。这意味着,在项目中,Taco Cloud Logo土建必须位于"src/main/resource/static/images/TacoCloud.png"。
1.3.3 测试控制器
import org.springframework.boot.test.autoconfigure.web.servlet.WebMvcTest;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
@RunWith(SpringRunner.class)
@WebMvcTest(HomeController.class)
public class HomeControllerTest {
@Autowired
private MockMvc mockMvc;
@Test
private void testHomePage() throws Exception{
mockMvc.perform(get("/"))
.andExpect(status().isOk())
.andExpect(view().name("home"))
.andExpect(content().string(
containsString("Welcom to my house")));
}
}
这个测试,没有使用@SpringBootTest标记,而是添加了@WebMvcTest注解。这是Spring Boot所提供的一个特殊测试注解,它会让这个测试在Spring MVC应用在上下文中执行。
首先使用MockMvc对象对"/"(根路径)发起HTTP GET请求。对于这个请求,我们设置了如下预期:
- 响应应该具备HTTP200(OK)状态;
- 视图的逻辑名称应该是home;
- 渲染后的视图应该包含文本"Welcome to…";
1.3.5 了解Spring Boot DevTools
- 代码变更后应用会自动重启;
- 当面浏览器的资源(如模板、JavaScript、样式表)等发生变化时,会自动刷新浏览器;
- 自动禁用模板缓存;
- 如果使用H2数据库的话,内置了H2控制器。
1.3.6 回顾
- Spring Initializr创建初始的项目结构;
- 编写控制器类处理针对主页的请求;
- 定义了一个视图模板来渲染主页;
- 编写了一个简单的测试类来验证工作符合预期。