一、简介
SpringBoot的设计初衷是为了简化Spring的应用开发,采用约定大于配置的思想,化繁为简,整合了整个Spring技术栈,让开发人员可以轻松创建一个独立的、产品级别的应用,为J2EE开发提供一站式解决方案。
Spring项目全家桶:
SpringBoot的优点:
- 快速创建独立运行的Spring项目以及与主流框架集成
- 使用嵌入式的Servlet容器,应用无需打成war包
- starters自动依赖与版本控制
- 大量的自动配置,简化开发,也可以修改默认值
- 无需配置xml文件,无代码生成,开箱即用
- 提供准生产环境的运行时应用监控
- 与云计算的天然集成
SpringBoot的缺点:
- 入门容易,精通难。
- 对Spring框架底层的熟悉有助于理解SpringBoot
SpringBoot与微服务
什么是微服务:
微服务是一个架构风格,将一个大型的应用分成多个小型服务,可以同Http的方式进行互通,且每个小型服务都是一个可独立替换和独立升级的单元;
大型应用做成单体应用与做成微服务的区别:
单体应用的测试、部署简单,但是协同开发与迭代的效率不高,微服务的特点则与之相反。
微服务的抽象描述:图中每个原点都是一个微服务,所有的原点一起组成一个大型的应用。
Spring如何通过微服务实现分布式:
SpringBoot 创建一个一个的微服务
SpringCloud 构建微服务的分布式部署
Spring Cloud Data Flow 实现数据流的传输、批处理等
SpringBoot的环境要求:
JDK:1.8
Maven:3.3,Maven的settings.xml中设置JDK的版本
IDEAL:2017
二、HelloWorld
1、SpringBoot官网创建一个SpringBoot工程,系统会生成如下两个SpringBoot的依赖
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
2、写一个Controller,用Get请求返回"Hello World!"返回
@RestController
public class TestController {
@GetMapping(value="/hello")
public String test(){
return "Hello World!";
}
}
3、启动Application类,浏览器测试hello请求
如何让SpringBoot将项目打成jar包?pom文件中设置packing属性,packing为war的时候,打的就是war包。
<packaging>jar</packaging>
三、内部原理
SpringBoot默认的依赖版本管理:在pom.xml 文件中
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
这个依赖的父项目是:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath>../../spring-boot-dependencies</relativePath>
</parent>
这是管理SpringBoot所有默认的依赖版本的地方;
以后导入依赖不需要写版本号(没有被dependencies管理的依赖自然要声明版本号)
启动器:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
spring-boot-starter-web:SpringBoot的场景启动器,提供Web正常运行所需要的组件依赖。
SpringBoot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter,相关场景的所有依赖都会导入进来,要用什么功能就导入什么场景的启动器。
官网的starters(启动器)场景列表:
https://docs.spring.io/spring-boot/docs/2.1.7.RELEASE/reference/htmlsingle/#using-boot-starter
主程序类,入口类
/**
* SpringBoot 来标注一个主程序类,表明这是一个SpringBoot应用
*/
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
protected SpringApplicationBuilder configure(SpringApplicationBuilder builder){
return builder.sources(new Class[] { Application.class });
}
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication: SpringBoot的主配置类
@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) })
public @interface SpringBootApplication {
标注在某个类上,表示这是一个SpringBoot的主配置类和入口类
@Configuration:配置类上来标注这个注解;
配置类等同于Spring旧版本中的配置文件;配置类也是容器中的一个组件@Component
@EnableAutoConfiguration:开启自动配置功能
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
使SpringBoot的自动配置生效
@AutoConfigurationPackage:自动配置包
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(AutoConfigurationPackages.Registrar.class)
public @interface AutoConfigurationPackage {
@Import(AutoConfigurationPackages.Registrar.class)
Spring的底层注解@Import,给容器中导入一个组件,由导入的组件有 AutoConfigurationPackages.Registrar.class
将主配置类(@SpringBootApplication标注的类)所在包及下面所有子包里面的所有组件扫描到Spring容器;
因此,SpringBoot的主配置类的位置不能随意指定。
@Import(AutoConfigurationImportSelector.class)
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
给容器中导入组件
AutoConfigurationImportSelector:导入哪些组件的选择器;
将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中;
会给容器中导入非常多的自动配置类(xxxAutoConfiguration);就是给容器中导入这个场景需要的所有组件,并配置好这些组件。
有了自动配置类,免去了我们手动编写配置注入功能组件的工作;
从类路径下的 META-INF/spring.factories 获取 EnableAutoConfiguration 指定的值,将这些值作为自动配置类导入到容器中,自动配置类就会生效,帮我们进行自动配置工作。(以前需要手动配置的东西,自动配置都会自动配置好)
J2EE的整体整合解决方案和自动配置都在 spring-boot-autoconfigure-2.1.7.RELEASE.jar;
四、快速创建一个SpringBoot项目
SpringBoot官网提供自动生成一个SpringBoot的方式:
IDE工具则可以使用Spring的项目创建向导快递创建一个Spring Boot项目;
快速生成的SpringBoot项目包含以下内容:
主配置类 Application.java
resource文件夹中目录结构:
- static:保存所有的静态资源;js css images;
- templates:保存所有的模板页面;(SpringBoot默认jar包使用嵌入式的Tomcat,默认不支持JSP页面);可以使用模板引擎(freemarker、thymeleaf);
- application.properties:SpringBoot应用的配置文件,可以在该文件中修改配置的默认值,如端口号