该栏目会系统的介绍SpringBoot的知识体系,共分为基础部分、源代码和综合实例等模块
SpringBoot 简介
1、概述
- :是一个整合 Spring 技术栈的一站式框架,也是快速创建 Spring 应用的脚手架
2、特点
- 快速创建 Spring 应用
- 使用嵌入式的 Servlet 容器,无需打包成War包
- 自动 starter 依赖,简化构建配置
- 提供生产环境中应用监控,健康检查及外部配置
3、集群、分页式和微服务
集群
:同一个业务布置在多台服务器上,是一种物理形态分页式
:同一个业务拆分成多个子业务,部署在不同服务上,是一种工作方式微服务
:将模板拆分成一个个独立的服务,服务间通过接口实现数据交互,可以部署在同一服务器,也可以部署在多个服务上。
SpringBoot 基础
1、创建 SpringBoot 项目
配置maven
<!--打开maven中的settings.xml-->
<!--配置阿里云镜像-->
<mirrors>
<mirror>
<id>nexus-aliyun</id>
<mirrorOf>central</mirrorOf>
<name>Nexus aliyun</name>
<url>http://maven.aliyun.com/nexus/content/groups/public</url>
</mirror>
</mirrors>
<!--让maven使用jdk1.8进行项目编译-->
<profiles>
<profile>
<id>jdk-1.8</id>
<activation>
<activeByDefault>true</activeByDefault>
<jdk>1.8</jdk>
</activation>
<properties>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.compilerVersion>1.8</maven.compiler.compilerVersion>
</properties>
</profile>
</profiles>
<!--添加maven插件,可以让项目打包成jar包-->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
导入相关依赖
<!--导入父工程-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<dependencies>
<!--导入web场景启动器-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
编写主程序类
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
编写控制器类
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello,Spring Boot!";
}
}
配置文件(application.yml)
server:
port: 8888
2、依赖管理
概述
:父项目用于做依赖管理,让开发时导入 starter 场景启动器无需关注版本号,自动版本仲裁,也可以按需可以修改版本号图示
配置说明
<!--该项目的父项目-->
<!--用于做依赖管理,无需关注版本号,自动版本仲裁-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
<!--可以修改版本号-->
<properties>
<mysql.version>5.4.3</mysql.version>
</properties>
<!--starter场景启动器:该场景下所有相关的依赖-->
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
<!--父项目的父项目:底层依赖,声明了开发中常用的依赖的版本-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.3.4.RELEASE</version>
</parent>
3、自动配置
概述
:项目启动时对一些相关注解的类,自动注入到 Spring 容器中流程
:启动类中标记了 @SpringBootApplication 注解,该注解下面标识了 @EnableAutoConfiguration 注解,该注解用于启动自动配置,在该注解下标记了 @Import(AutoConfigurationImportSelector.class) ,该类中的 selectImport() 方法中主要加载了 META-INF/spring.factorie 中配置的127个场景启动器类的全类名引导加载自动配置类
@SpringBootApplication
public class MainApplication {
}
@SpringBootApplication分析///
@SpringBootConfiguration // 代表MainApplication是一个配置类
@ComponentScan(excludeFilters = {
@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}),
@Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class})
}) // 组件扫描
@EnableAutoConfiguration
public @interface SpringBootApplication {
}
@EnableAutoConfiguration分析///
@AutoConfigurationPackage // 利用Registrar类,将指定一个包(MainApplication所在的包下)
// 下的所有组件导入
@Import({AutoConfigurationImportSelector.class}) // 自动装配
public @interface EnableAutoConfiguration {
}
AutoConfigurationImportSelector分析///
// 获取自动配置实例
跳转到 => selectImports(){ ... }
// 给容器导入一些组件
点击进入 => this.getAutoConfigurationEntry(annotationMetadata);
// 获取一些后选配置
点击进入 => this.getCandidateConfigurations(annotationMetadata, attributes);
// 使用Spring工厂加载器加载
点击进入 => SpringFactoriesLoader.loadSpringFactories(classLoader);
// 从META-INF/spring.factorie加载其127个场景全部加载,
// 但最终会按照条件装配规则
点击进入 => classLoader.getResources("META-INF/spring.factories")
按需加载自动配置项
:虽然我们127个场景的所有自动配置启动的时候默认全部加载。 xxxxAutoConfiguration 按照条件装配规则(@Conditional),最终会按需配置定制化修改自动配置
:SpringBoot 默认会在底层配好所有的组件。但是如果用户自己配置了以用户的优先
4、容器功能
注解 | 功能 |
---|---|
@Configuration | 告诉SpringBoot这是一个配置类(类似于以前的bean.xml),配置类本身也是组件 |
@Import | 在容器中的组件中才能使用,用于给容器自动创建出这些类型的组件 |
@ImportResource | 用于导入Spring配置文件 |
@ComponentScan | 包扫描 |
@Conditional | 条件装配,用于指定条件,当满足条件时才进行组件注入 |
@Bean | 向容器中添加组件 |
@Component | 向容器中添加组件 |
@Controller | 向容器中添加组件 |
@Service | 向容器中添加组件 |
@Repository | 向容器中添加组件 |
// 告诉SpringBoot这是一个配置类,配置类本身也是组件
// @Configuration(proxyBeanMethods = true),当代理对象调用方法为true时,为Full全模式,
// 该模式总是从容器获取之前的对象(单实例),否则,为Lite轻量级模式
@Configuration(proxyBeanMethods = true)
// 在容器中的组件中才能使用@Import,用于给容器自动创建出这些类型的组件,默认组件名称是全类名
@Import({Pet.class,DBHelper.class})
// 用于导入Spring配置文件
@ImportResource("classpath:bean.xml")
public class className{
// 向容器添加组件,以方法名作为组件的Id,返回类型即组件类型,返回的值,就是组件在容器中的实例
@Bean
// 条件装配,用于指定条件,当满足条件时才进行组件注入
@ConditionalOnBean(name = "pet") // 当容器中有pet组件时才注入User,
// 注解在方法中只对该方法注入组件有用,如果注解在类中则对所有的组件有用
public User user(){
return new User();
}
}