1. SpringBoot HelloWorld
在使用 SpringBoot 框架时,个人推荐参考官方网站,虽然是英文文档也比较难懂些,但是也是最权威的。好吧,下面开始从基础上来创建一个 SpringBoot 项目吧!
假设现在需要一个简单的功能,即浏览器向 SpringBoot 项目发送一个 hello 请求,服务器接受请求并处理后,在页面上显示Hello World字符串。
1.1 创建 Maven 项目
1.2 导入 SpringBoot 依赖
首先我们需要在 pom.xml 文件中导入SpringBoot 相关的依赖:
1 | <parent> |
这里我们只需简单地知道,spring-boot-starter-parent
表示与 SpringBoot 相关的依赖,而 spring-boot-starter-web
则表示与 web 相关的依赖,比如 web-mvc 依赖。
1.3 编写主程序类
我们在包 com.shoto 下创建一个主程序类 HelloWorldMainApplication,该类是 SpringBoot 程序的入口,其中的 main 中的 run 方法用于启动 SpringBoot 应用:
1 | /* |
1.4 编写 Controller 类
在com.shoto.controller 包下编写一个控制器类,具体如下:
1 |
|
1.5 运行主程序测试
1.6 简化部署
如果我们需要快速的创建一个可运行 jar 包,首先我们需要在 pom.xml 中导入相关的依赖:
1 | <!--生成可执行jar包--> |
然后使用 maven 执行 mvn package
命令,此时会在 target 目录下生成相应的可运行 jar。我们可以使用命令java -jar jar名称
来运行该 jar 包。
2. Hello World 探究
在前面我们已经创建和运行了一个简单的 SpringBoot 应用,下面我们来解释一下该 HelloWorld 程序的一些细节。
2.1 pom 文件
2.1.1 父项目
前面我们在 pom 文件中配置了如下内容:
1 | <parent> |
它是 SpringBoot 应用的核心配置,我们点击 spring-boot-starter-parent
可以发现其父项目是 spring-boot-dependencies
,具体内容如下:
1 | <parent> |
点击spring-boot-dependencies
后我们可以发现其管理了 SpringBoot 应用里面的所有依赖版本,因此以后我们导入依赖默认是不需要写版本的,当然如果没有在 dependencies
里面管理的依赖自然需要声明版本号。
2.1.2 启动器
同样的,前面我们在 pom 文件中也配置了如下内容:
1 | <!--配置web相关依赖--> |
spring-boot-starter-web
表示 web 相关的启动器,它帮我们导入了 web 模块正常运行所依赖的所有组件,这样就可以减少我们的配置以及配置出错的情况。该 web 启动器包含的依赖有:
1 | <dependency> |
SpringBoot 将所有的功能场景都抽取出来,做成一个个的 starters(启动器),我们只需要在项目里面引入这些 starter,那么相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。
SpringBoot 支持的启动器的相关详细信息可参考官方文档.
2.2 主程序类
1 | /* |
这里我们需要注意的是 @SpringBootApplication 注解,其声明了 HelloWorldMainApplication 是一个主程序类,SpringBoot 会运行这个类的 main 方法来启动 SpringBoot 应用。
2.2.1 @SpringBootApplication
点击 @SpringBootApplication 该注解,我们可以发现其部分内容如下:
1 | (ElementType.TYPE) |
在这里,我们只需关注 @SpringBootConfiguration 和 @EnableAutoConfiguration 这两个注解。
@SpringBootConfiguration :标注在某个类上,用于表示这是一个Spring Boot的配置类;
点击 @SpringBootConfiguration 后我们可以发现其也是由以下多个注解组成的:
1
2
3
4
5
6
7({ElementType.TYPE})
(RetentionPolicy.RUNTIME)
public SpringBootConfiguration {
...
}其中,注解 @Configuration 表明当前类是 Spring 的一个配置类,相当于我们 Spring 的一个配置文件,不过这里是以一个 Java 类的形式,该类也是一个组件(Component)。
@EnableAutoConfiguration :开启 SpringBoot 的自动配置功能,这样自动配置才能生效。
我们点击 @EnableAutoConfiguration 注解,我们可以发现其部分内容如下:
1
2
3
4
5
6
7
8
9(ElementType.TYPE)
(RetentionPolicy.RUNTIME)
(EnableAutoConfigurationImportSelector.class)
public EnableAutoConfiguration {
...
}在这里,我们需关注 @AutoConfigurationPackage 和 @Import(EnableAutoConfigurationImportSelector.class) 这两个注解:
点击 @AutoConfigurationPackage 注解,我们发现其是由 @Import({Registrar.class}) 等注解构成的,其作用是将主配置类(@SpringBootApplication标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring 容器中。本项目中我们的主程序类的包是
com.shoto
,所以如果我们在该包外创建一个 controller 类,其是不会加入 Spring 容器中的,这一点需要额外注意;@Import(EnableAutoConfigurationImportSelector.class) 注解会将 EnableAutoConfigurationImportSelector 类加入到 IoC 容器中,同时也会将自动配置类(xxxAutoConfiguration)及其相应的组件一并导入。
SpringBoot 的自动配置类位于 spring-boot-autoconfigure-2.2.1.RELEASE.jar 中,我们可以在 META-INF/spring.factories 中查看,其部分内容如下所示:
1
2
3
4
5
6
7
8
9
10
11# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration,\
org.springframework.boot.autoconfigure.aop.AopAutoConfiguration,\
...
org.springframework.boot.autoconfigure.data.solr.SolrRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisReactiveAutoConfiguration,\
org.springframework.boot.autoconfigure.data.redis.RedisRepositoriesAutoConfiguration,\
org.springframework.boot.autoconfigure.data.rest.RepositoryRestMvcAutoConfiguration,\
...其中 RedisAutoConfiguration 中则实现了 Redis 相关的自动配置,比如 RedisTemplate 的配置,不同的于 Spring 中使用 <bean> 标签,这里直接使用如下代码来实现。@Bean 可以将方法的返回值加入到 IoC 容器中。
1
2
3
4
5
6
7
8
9
10
(
name = {"redisTemplate"}
)
public RedisTemplate<Object, Object> redisTemplate(RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {
// 创建一个 RedisTemplate
RedisTemplate<Object, Object> template = new RedisTemplate();
template.setConnectionFactory(redisConnectionFactory);
return template;
}
以上即是注解 @SpringBootApplication
和其相关注解的一些作用,其标注的类即为一个主程序类,同时也是一个配置类。其作用是 SpringBoot 应用的启动入口,同时引发 SpringBoot 的自动配置生效等功能。
3. 快速创建 SpringBoot 项目
3.1 网站在线创建
我们可以访问该网站(点击),在线配置并下载 SpringBoot 项目,然后使用 IDEA 等软件打开即可。
3.2 Spring Initializer 创建
IDEA 支持使用 Spring 的项目创建向导来快速创建一个 SpringBoot 项目,如下图所示。点击 next 后,具体的配置按需求来就好了。
默认生成的项目我们需要注意的是 resources 文件夹。
- resources 文件夹中的目录结构:
- static:保存所有的静态资源; js css images;
- templates:保存所有的模板页面;(SpringBoot 默认 jar 包使用嵌入式的 Tomcat,默认不支持 JSP 页面);可以使用模板引擎(freemarker、thymeleaf);
- application.properties:SpringBoot 应用的全局配置文件,比如配置与数据库的连接信息和 Tomcat 的端口号等等。