一.简介
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。用我的话来理解,就是 Spring Boot 其实不是什么新的框架,它默认配置了很多框架的使用方式,就像 Maven 整合了所有的 Jar 包,Spring Boot 整合了所有的框架。
以往我们采用Spring+SpringMVC+MyBatis框架进行开发的时候,搭建和整合三大框架,我们需要做很多的工作,需要配置web.xml,Spring的配置文件,SpringMVC的配置文件等。使用Spring Boot不需要配置这么多东西,只需要简单配置就可以搭建起框架。
SpringBoot的特点
- 为基于Spring的开发提供更快的入门体验
- 开箱即用,没有代码生成,也无需XML配置。同时也可以修改默认值来满足特定的需求
- 提供了一些大型项目中常见的非功能性特性,如嵌入式服务器、安全、指标,健康检测、外部配置等
- SpringBoot不是对Spring功能上的增强,而是提供了一种快速使用Spring的方式
SpringBoot的核心功能
- 起步依赖
起步依赖本质上是一个Maven项目对象模型(Project Object Model,POM),定义了对其他库的传递依
赖,这些东西加在一起即支持某项功能。
简单的说,起步依赖就是将具备某种功能的坐标打包到一起,并提供一些默认的功能。 - 自动配置
Spring Boot的自动配置是一个运行时(更准确地说,是应用程序启动时)的过程,考虑了众多因素,才决定Spring配置应该用哪个,不该用哪个。该过程是Spring自动完成的。
二.使用Maven创建HelloWorld
- jdk1.8:Spring Boot 推荐jdk1.7及以上;java version "1.8.0_112"
- maven3.x:maven 3.3以上版本;Apache Maven 3.3.9
- IntelliJIDEA2019
- SpringBoot 2.3.0.RELEASE
- 统一环境;
2.1 Maven设置
1.创建一个maven工程;(jar)
2.导入SpringBoot的相关依赖;
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
3.编写一个主程序,启动Spring Boot应用
/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
// Spring应用启动起来
SpringApplication.run(HelloWorldMainApplication.class,args);
}
}
4.编写相关的Controller,Service;
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello(){
return "Hello World!";
}
}
5.运行主程序测试;
6.简化部署
<!--这个插件,可以将应用打包成一个可执行的jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
三.HelloWorld探究
3.1 POM文件
3.1.1 父项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.0.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
这个的父项目是:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.0.RELEASE</version>
</parent>
查看这个项目可以发现是这个项目来管理SpringBoot应用里面的所有依赖版本
Spring Boot的版本仲裁中心; 以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖自然需要声明版本号)
3.1.2 启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web:
spring-boot-starter:spring-boot场景启动器,帮我们导入Web模块正常运行所依赖的组件。
Spring Boot将所有的功能场景都抽取出来,做成一个个的的starter(启动器),只需要项目里面引入这些starter相关的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。
3.2 主程序类,主入口类
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication:SpringBoot应该标注在某个类上说明这个类是SpringBoot的主配置类,SpringBoot就应该运行这个类的main方法来启动SpringBoot应用。
点击去这个注解,查看注解@SpringBootApplication的的注解
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(
excludeFilters = {@Filter(
type = FilterType.CUSTOM,
classes = {TypeExcludeFilter.class}
), @Filter(
type = FilterType.CUSTOM,
classes = {AutoConfigurationExcludeFilter.class}
)}
)
(1)@SpringBootConfiguration:SpringBoot的配置类,标注在某个类上,表示这是一个Spring Boot的配置类。
@Configuration
public @interface SpringBootConfiguration {
@Component
public @interface Configuration {
@Configuration配置类(相当于配置文件)上标注这个注解,配置类也是容器中的一个组件@Component。
(2)@EnableAutoConfiguration:开启自动配置功能。以前我们需要配置的东西,Spring Boot帮我们去配置;这个注解告诉Spring Boot开启自动配置功能,这样自动配置才能生效。
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
@AutoConfigurationPackage:自动配置包
点进入@AutoConfigurationPackage这个注解:
@Import({Registrar.class})
public @interface AutoConfigurationPackage {
-@Import(Register.class):Spring的底层注解@Import,给容器中导入一个组件;导入的组件是Register.class。
@Import(AutoConfigurationImportSelector.class):给容器中导入组件
AutoConfigurationImportSelector:导入哪些组件的容器。将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。
会给容器中导入非常多的自动配置类(xxxAutoConfiguration),就是给容器导入这个场景需要的所有组件,并配置好这些组件。
protected List<String> getCandidateConfigurations(AnnotationMetadata metadata, AnnotationAttributes attributes) {
List<String> configurations = SpringFactoriesLoader.loadFactoryNames(this.getSpringFactoriesLoaderFactoryClass(), this.getBeanClassLoader());
Assert.notEmpty(configurations, "No auto configuration classes found in META-INF/spring.factories. If you are using a custom packaging, make sure that file is correct.");
return configurations;
}
protected Class<?> getSpringFactoriesLoaderFactoryClass() {
return EnableAutoConfiguration.class;
}
Spring Boot在启动的时候从类路径下的/META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入容器中,自动配置类就生效,帮我们进行自动配置工作。
J2EE的整体整合解决方案和自动配置都在spring-boot-autoconfigure-2.3.0.RELEASE.jar。
四.使用Spring Initializer快速创建项目
IDEA都支持使用Spring的项目创建向导快速创建一个Spring Boot项目。
选择我们需要的模块,向导会联网创建Spring Boot项目。
默认生成的Spring Boot项目:
- 主程序已经生成好,只需要自己逻辑。
- reources文件夹中的目录结构:
static:保存所有的静态资源,jss,cssimages。
templates:保存所有模板(spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker,thymeleaf)。
application.properties:Spring Boot的配置文件,可以修改一些默认配置。