《Spring in Action》第1章-开始使用Spring
开始使用Spring
1、构建一个Spring应用
使用Spring Initializr构建应用:
- http://start.spring.io
- 为Eclipse安装插件,并使用Eclipse创建
- 在IntelliJ IDEA中创建
2、构建后的应用结构
在构建项目时我们选择以下的依赖:
生成的项目结构如下:
- 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包目录结构如下:
只有项目相关的代码和资源,没有依赖包,执行这个jar包包下面的错误:
加上插件后的jar包目录结构:在BOOT-INF目录下,不仅有项目代码和资源,还有所有的依赖包:
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中的图标可能是这样的:
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
来查看数据库的记录。
上一篇: MySQL快速入门指南(1)
推荐阅读
-
《Spring in Action》第1章-开始使用Spring
-
Spring源码深度解析(第2版)- 自定义标签的使用
-
Spring源码深度解析(第2版)- 时序图及源码(js-sequence-diagrams)
-
第5本书 spring3.x
-
第1章—Spring之旅—简化Spring的java开发
-
struts2+spring+hibernate分页代码[比较多]第1/7页
-
spring aop action中验证用户登录状态的实例代码
-
spring aop action中验证用户登录状态的实例代码
-
Spring注解驱动开发第3讲——使用@ComponentScan自动扫描组件并指定扫描规则
-
第1章 Spring Cloud 构建微服务架构(一)服务注册与发现