SpringBoot 入门及两大特性分析
0 前言
Spring从诞生之初,基于最核心的依赖注入(DI)和面向切面编程(AOP),实现了重量级EJB的功能,虽然说Spring是一个轻量级的框架(和EJB相比),但是配置却“重量级”,Spring 从最初版本的XML配置 -> Spring2.5 的基于注解的组件扫描(component-scan) -> Spring3.0 的基于 Java 的配置【1】,目的都是为了减少应用程序内的显示XML配置。
尽管如此,我们仍需要显示配置。例如,我们需要使用SpringMVC的时候,仍需要配置DispatcherServlet。
除此之外,项目的依赖管理也很头疼,我们需要考虑不同版本之间依赖是否会发生冲突的问题。
当使用了Spring Boot之后,这一切都成为了过去。
本文通过简单的入门案例,分析SpringBoot的两大特性:起步依赖和自动配置,以及最后SpringBoot如何创建一个生产环境可用的"胖"jar包。
1 一个简单的Spring Boot 应用
在开始SpringBoot之前,我们简单想想之前是怎么开发一个简单的Web 应用?
需要准备如下:
- 导入 SpringMVC 和 Servlet API 的依赖
- 一个
web.xml
文件 - 一个启用Spring MVC 的Spring 配置
- 一个 Controller 控制器,处理http请求
- 一个web容器,如:Tomcat
作为比较,我们下面我们写一个能实现相同功能的Spring Boot应用
PS:
自动化构建SpringBoot项目的方式很多,如使用IDEA的Spring Initializr, https://start.spring.io/, CLI的方式等,大家自行 google,这里我手动进行构建。
1.1 构建Maven项目
构建一个普通的maven项目,这里省略
1.2 起步依赖
在 pom.xml
文件中,加入父起步依赖和web起步依赖
<?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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<!--此段parent的配置是从spring-boot-starter-parent继承版本号-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.0.0.RELEASE</version>
</parent>
<groupId>me.fishsx</groupId>
<artifactId>DemoApplication</artifactId>
<version>1.0-SNAPSHOT</version>
<!--导入 web 的起步依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
可以看到起步依赖比较之前普通的依赖相比,有2个特点:
- artifactId都是以
spring-boot-starter
开头- 不需要写version版本号
下面第二节会详细分析起步依赖
1.3 构建启动类
在 src/main/java
下构建包名+启动类名
启动类,需要在类上加入**@SpringBootApplication**注解,并且类中写入一个main
方法,代码是固定的 SpringApplication.run(DemoApplication.class, args);
package me.fishsx;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
* SpringBoot启动类
*/
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
PS: 注意启动类的路径位置
启动类的位置必须在其他类/包的 同级或父级目录中,这是因为默认情况下,Spring扫描的注解会根据启动类的位置开始向子目录递归扫描
1.4 构建控制器类
在me.fishsx
包下,新增controller
包并新建UserController
类,代码如下:
@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "hello springboot!";
}
}
1.5 运行启动类测试
启动Spring Boot应用有两种方式
- 使用IDE工具启动
- 使用Maven命令:
mvn spring-boot:run
使用IDE工具运行启动类,发现日志打印如下
发现Tomcat已启动在8080
端口,我们访问 http://localhost:8080/user/hello
输出结果:
同时,我们发现控制台日志也发生了变化,出现了DispatcherServlet
的初始化信息
总结:
上面我们简单的写了一个简单的SpringBoot Demo,但是我们并没有配置Tomcat和DispatcherServlet,但是日志中却出现了相关的信息,这就是Spring Boot带来的自动化配置,