SpringBoot工程搭建
使用idea搭建SpringBoot
使用initializer 创建项目
File->new->project;
选择“Spring Initializr”,点击next;(jdk1.8默认即可)
完善项目信息,组名可不做修改,项目名可做修改;最终建的项目名为:test,src->main->java下包名会是:com->example->test;点击next;
Web下勾选Spring Web;点击next;
选择项目路径,点击finish;打开新的窗口;
刚创建好的项目目录结构
使用 Maven 管理依赖,自动生成的 POM 文件内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<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.2.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.example</groupId>
<artifactId>test</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>test</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
<exclusions>
<exclusion>
<groupId>org.junit.vintage</groupId>
<artifactId>junit-vintage-engine</artifactId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
<!--自己添加的阿里云仓库 如果不添加会到中央仓库下载 很慢-->
<repositories>
<repository>
<id>nexus-aliyun</id>
<name>Nexus aliyun</name>
<layout>default</layout>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
<releases>
<enabled>true</enabled>
</releases>
</repository>
</repositories>
</project>src/main/resource 目录下生成的 application.properties 是 Spring Boot 的配置文件(也可以修改为 .yml 格式),初始化此文件无任何内容,需要开发人员自己配置,有关 Spring Boot 的配置不在本文讨论范围内。
Idea SpringBootApplication.java 中包含应用入口,内容如下
1
2
3
4
5
6
public class TestApplication {
public static void main(String[] args) {
SpringApplication.run(TestApplication.class, args);
}
}自定义一个 Controller 处理首页 HTTP 请求(Spring MVC 知识)
1
2
3
4
5
6
7
8
public class IndexController {
public String index() {
return "这是 Spring Boot Web 首页";
}
}运行 Idea SpringBootApplication 中的 main 方法启动工程,从启动日志中可以看出,Spring Boot Web 使用内嵌的 Tomcat 服务器
打开浏览器,输入 http://localhost:8080/
普通方式创建项目
File->new->project;
选择“maven”,点击next;(jdk1.8默认即可)
配置好项目名称以及 坐标的选项点击finish完成即可。
选择新窗口打开
在POM文件配置spring-boot-starter-parent
在POM文件配置spring-boot-starter-web
1
2
3
4<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>创建启动类
1
2
3
4
5
6
7
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}创建IndexController
1
2
3
4
5
6
7
8
public class IndexController {
public String index() {
return "这是 Spring Boot Web 首页";
}
}运行 Idea SpringBootApplication 中的 main 方法启动工程,从启动日志中可以看出,Spring Boot Web 使用内嵌的 Tomcat 服务器
打开浏览器,输入 http://localhost:8080/
在idea中使用热部署
在实际开发过程中,每次修改代码就得将项目重启,重新部署,比如修改一个html代码就需要重启服务器,曾经帮同学调试过一个代码,html打印一个alert() 然后竟然重启半个小时,改了不到十行代码,重启过程就已经占用了开发过程的十分之九,开发效率何其地下,如果加上热部署会快许多许多。
名词解释
devtools:是spring boot的一个热部署工具,当修改了classpath下的文件(包括类文件、属性文件、页面等)时,会重新启动应用(由于其采用的双类加载器机制,这个启动会非常快,如果发现这个启动比较慢,可以选择使用jrebel)
双类加载器机制:boot使用了两个类加载器来实现重启(restart)机制:base类加载器+restart类加载器。
base类加载器:用于加载不会改变的jar(第三方依赖的jar)
restart类加载器:用于加载我们正在开发的jar(整个项目里我们自己编写的类)。当应用重启后,原先的restart类加载器被丢掉、重新new一个restart类加载器来加载这些修改过的东西,而base类加载器却不需要动一下。
修改pom文件
在pom文件加入 devtools
1 | <dependency> |
注意
devtools可以实现页面热部署(即页面修改后会立即生效,这个可以直接在application.properties文件中配置spring.thymeleaf.cache=false来实现),实现类文件热部署(类文件修改后不会立即生效),实现对属性文件的热部署。即devtools会监听classpath下的文件变动,并且会立即重启应用(发生在保存时机),注意:因为其采用的虚拟机机制,该项重启是很快的
配置了true后在修改java文件后也就支持了热启动,不过这种方式是属于项目重启(速度比较快的项目重启),会清空session中的值,也就是如果有用户登陆的话,项目重启后需要重新登陆。
默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。
修改application.yml
在application.yml中配置一下devtools
1 | spring: |
IDEA中配置
当我们修改了类文件后,idea不会自动编译,得修改idea设置。
配置自动编译
File-Settings-Compiler-Build Project automatically
开启运行时自动编译
在idea中输入快捷键 ctrl + shift + alt + / 选择注册
在打开的窗口 勾上 Compiler autoMake allow when app running
注意:第一次选择应该实在下面不在第一行,需要向下找找
Chrome禁用缓存
F12或者“Ctrl+Shift+I”,打开开发者工具,“Network” 选项卡下 选中打勾 “Disable Cache(while DevTools is open)”
不能使用分析
- 对应的spring-boot版本是否正确;
- 是否加入spring-boot-maven-plugin,以及属性
true - idea 是否开启了Build Automatically
- 如果设置SpringApplication.setRegisterShutdownHook(false),则自动重启将不起作用。
补充
默认情况下,/META-INF/maven,/META-INF/resources,/resources,/static,/templates,/public这些文件夹下的文件修改不会使应用重启,但是会重新加载(devtools内嵌了一个LiveReload server,当资源发生改变时,浏览器刷新)。
如果想改变默认的设置,可以自己设置不重启的目录:spring.devtools.restart.exclude=static/**,public/**,这样的话,就只有这两个目录下的文件修改不会导致restart操作了。
如果要在保留默认设置的基础上还要添加其他的排除目录:spring.devtools.restart.additional-exclude
如果想要使得当非classpath下的文件发生变化时应用得以重启,使用:spring.devtools.restart.additional-paths,这样devtools就会将该目录列入了监听范围。
关闭自动重启
设置 spring.devtools.restart.enabled 属性为false,可以关闭该特性。可以在application.properties中设置,也可以通过设置环境变量的方式。
1 | System.setProperty("spring.devtools.restart.enabled","false"); |
测试
注意以下的热部署方式在IDEA是默认没有打开自动编译的,手动编译需要快捷键(Ctrl+Shift+F9),自动编译的修改配置如下:(注意刷新不要太快,会有1-2秒延迟)
html测试
在html写一些字符
刷新浏览器查看
java代码测试
在controller增加输出语句
刷新浏览器测试
测试通过