1. 框架简介
Spring Boot框架是简化Spring开发的框架,是基于Spring框架的再封装,通过自动配置,简化开发者对不同框架整合时所需的配置。Spring Boot是对Spring技术栈的大整合,是J2EE开发一站式解决方案。
优点:
- 快速创建独立运行的的Spring项目以及和主流框架的集成;
- 使用嵌入式Servlet容器,应用无需打包成war包;
- 通过starter进行自动依赖和版本控制;
- 有大量的自动配置,简化开发,也可以修改默认值;
- 无需配置xml,不用代码生成器,开箱即用;
- 部署简单,便于维护和升级;
- 天然与微服务和云计算相契合;
2. 微服务简介
微服务是martin fowler在2014年发表的论文中提到微服务的概念是一种架构思想,主体思想是对以往的单体应用进行功能的拆分,不同的功能拆分成不同的服务部署在不同的服务器上,各个服务之间通过HTTP的方式进行互通。
martin fowler的论文:微服务论文
单体应用
特征:ALL IN ONE
所有的服务和功能在同一个项目中,代码间相互调用方便,部署在一台服务器上。随着业务功能的拓展项目模块会越来越庞大复杂,增加了项目开发维护的成本,升级维护时需要对整个项目进行重新部署。
微服务应用
采用分而治之的方式对项目中的不同模块进行开发,以确保每个功能元素始终是一个可以独立替换和升级的软件单元。每个服务模块仅关注特定的业务功能,业务清晰代码量少,已与开发和维护。支持系统快速升级迭代,部分功能出现异常不会对整体系统产生影响。
此处对微服务架构仅简单的介绍,这里放一篇对不同架构详细介绍的博客:相关博客
3. 环境配置
jdk1.8+:Spring Boot官方推荐jdk1.7以上
maven 3.2+:Spring官方推荐maven 3.2以上版本使用
SpringBoot 2.3.4.RELEASE:Spring最新的稳定版
IDE:IntelliJ IDEA或STS(Spring Tool Suite)
关于Spring Boot不同版本之间的关系介绍请参考:Spring Boot个版本之间的关系
不同Spring Boot版本需要的配置环境请参考Spring官方文档:Spring Boot官方文档
关于IDEA整合maven的内容此处不再介绍,推荐查看博客:IDEA中配置maven
4.创建Spring Boot应用
4.1 通过maven创建
① 创建maven工程,打包方式jar包
② 书写pom.xml文件,导入相关依赖
③ 书写主程序类,写好注解
④ 启动主项目,浏览器访问
示例代码:
① pom.xml文件
<?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>
<groupId>cn.bruce</groupId>
<artifactId>springBoot-01-helloword</artifactId>
<version>1.0-SNAPSHOT</version>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.9.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
② 书写主程序类:HelloWordMainApplication
/**
* @SpringBootApplication 用于标注一个主程序类,声明为一个Spring Boot应用
*/
@SpringBootApplication
public class HelloWorldMainApplication {
public static void main(String[] args) {
SpringApplication.run(HelloWorldMainApplication.class, args);
}
}
③ 创建controller包,书写业务代码:HelloController
@Controller
public class HelloController {
@ResponseBody
@RequestMapping("/hello")
public String hello() {
return "Hello SpringBoot";
}
@ResponseBody
@RequestMapping("/test")
public String test() {
return "Test SpringBoot";
}
}
④ 启动Spring Boot应用,在浏览器访问:localhost:8080/hello
即可查看在HelloController书写的功能
4.2 快速创建Spring Boot应用
通过IDE工具可以快速创建Spring Boot项目,以IntelliJ IDEA为例:
选择我们需要的模块,向导会联网创建Spring Boot项目,默认生成的Spring Boot项目。主程序已经生成好了,我们只需要我们自己的逻辑。 具体步骤:
① 新建项目选择Spring Initializer
② 配置项目相关的环境
③ 选择需要的模块
具体的步骤截图
① 使用Spring Inietializer构建项目
② 配置项目环境
③ 选择所需的模块
④ 输入项目名称和路径
创建完成后的项目结构:
resources文件夹中目录结构
- static:保存所有的静态资源; js css images;
- templates:保存所有的模板页面;(Spring Boot默认jar包使用嵌入式的Tomcat,默认不支持JSP页 面);可以使用模板引擎(freemarker、thymeleaf);
- application.properties:Spring Boot应用的配置文件;可以修改一些默认设置;
5. 分析Spring Boot创建的应用
5.1 pom文件
创建好的pom.xml文件,引用了父级的项目
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
pom.xml的父项目是 spring-boot-starter-parent-xxx.pom
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
spring-boot-starter-parent-xxx.pom
的父级项目是 spring-boot-dependencies-xxx.pom
,是用来管理Spring Boot应用中所有依赖的版本,是Spring Boot的版本仲裁中心。以后我们导入依赖默认是不需要写版本;(没有在dependencies里面管理的依赖还是需要声明版本号)
Spring Boot启动器
spring-boot-starter-web
:
spring-boot-starter:spring-boot场景启动器,用于帮我们导入了所需模块正常运行所依赖的组件;
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
此依赖就是Spring Boot的场景启动器,打开这个Starter。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-json</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<version>2.3.4.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>5.2.9.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.9.RELEASE</version>
<scope>compile</scope>
</dependency>
</dependencies>
实际上每个starter就是对相关模块依赖的整合,Spring Boot将所有的功能场景都抽取出来,做成一个个的starters(启动器),只需要在项目里面引入这些starter相关场景的所有依赖都会导入进来。要用什么功能就导入什么场景的启动器。
Spring官方文档中对starter的描述:参考链接
5.2 主程序类
/**
* @SpringBootApplication 来标注一个主程序类,说明这是一个Spring Boot应用
*/
@SpringBootApplication
public class DemoApplication {
public static void main(String[] args) {
// 启动Spring应用
SpringApplication.run(DemoApplication.class, args);
}
}
@SpringBootApplication
: Spring Boot应用注解在某个类上说明这个类是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}
)}
)
public @interface SpringBootApplication {
① @SpringBootConfiguration
:注明类是Spring Boot的配置类。此注解书写在某个类上,表示此类是个Spring Boot配置类;
@SpringBootConfiguration
注解由@Configuration
注解组成;@Configuration
用来标注某类是配置类。配置类可以替代配置文件,同时配置类也是IoC容器中组件,所以此注解由@Component
注解组成。
② @EnableAutoConfiguration
:表示开启Spring Boot自动配置功能。以前我们需要配置的内容,Spring Boot可以帮助我们自动配置,此注解是通知Spring Boot开启自动配置;
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
-
@AutoConfigurationPackage
:自动配置包的注解 -
@Import
:Spring的底层注解,用于给容器导入一个组件@Import({AutoConfigurationImportSelector.class})
:导入的组件由AutoConfigurationPackages.Registrar.class
将主配置类(@SpringBootApplication
标注的类)的所在包及下面所有子包里面的所有组件扫描到Spring容器;EnableAutoConfigurationImportSelector
:导入哪些组件的选择器。将所有需要导入的组件以全类名的方式返回,这些组件就会被添加到容器中。会给容器中导入非常多的自动配置类xxxAutoConfiguration
就是给容器中导入这个场景需要的组件名称,并配置好这些组件。有了自动配置类,可以省去我们自己手编写配置类注入组件等工作;SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,classLoader)
Spring Boot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作;以前我们需要自己配置的东西,自动配置类都帮我们进行配置;- J2EE的整体整合解决方案和自动配置都在
spring-boot-autoconfigure-2.3.4.RELEASE.jar
包中。
③ @ComponentScan
:此注解表示开启自动包扫描
总结:
@SpringBootApplication
注解是一个组合注解,通过@SpringBootApplication
注解可以完成对Spring Boot的自动配置和组件扫描。此处涉及到了很多的Spring 注解,后续会开个坑对Spring中常用的注解进行详细的介绍,敬请期待(≧∇≦)ノ