环境:
jdk1.8及以上
maven必须3.3+
SpringBoot就是整合Spring生态圈的一站式框架,是简化Spring技术栈的快速开发脚手架
优点
- 创建独立Spring应用
- 内嵌web服务器
- 自动starter依赖,简化构建配置
- 自动配置Spring以及第三方功能
- 提供生产级别的监控,健康检查及外部化配置
- 无代码生成,无需编写XML
缺点
- 版本帝,迭代快,需要时刻关注变化
- 封装太深,内部原理复杂,不容易精通
分布式的困难
- 远程调用
- 服务发现
- 负载均衡
- 服务容错
- 配置管理
- 服务监控
- 链路追踪
- 日志管理
- 任务调度
- …
云原生上云的困难
- 服务自愈
- 弹性伸缩
- 服务隔离(同一台机器A服务宕机不影响B服务)
- 自动化部署
- 灰度发布
- 流量治理
- …
注解
@Configuration
- proxyBeanMethods 配置类是否启用代理,默认true;启用代理则@Bean注入的组件为单例
@Import
注入组件,被注入组件使用无参构造器创建
@Conditional***
条件装配,可用于@Configuration类或@Bean方法
@ImportResource
组件装配引用xml配置类,场景:旧项目迁移的时候有很多xml,直接复用
@ConfigurationProperties(prefix = "***")
配置文件自动注入,可以选择:1)与@Component
一起使用;2)不使用@Component
,配置类中使用@EnableConfigurationProperties
指定开启配置文件注入的类
自动配置原理
@SpringBootApplication
- 由三个注解组合而成
@SpringBootConfiguration
(配置类)@ComponentScan
(包扫描)@EnableAutoConfiguration
(自动配置,下面详解)
@EnableAutoConfiguration
- 由两个注解组成
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
@AutoConfigurationPackage
- 是一个
@Import
,其利用AutoConfigurationPackages.Registrar
给容器导入一系列组件(及指定包目录下的组件)
- 是一个
@Import(AutoConfigurationImportSelector.class)
- 利用
getAutoConfigurationEntry(annotationMetadata);
给容器中批量导入一些组件 - 调用
getCandidateConfigurations(annotationMetadata, attributes);
获取到所有需要导入到容器的配置类 - 利用工厂加载
Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader)
得到所有组件 - 从
META-INF/spring.factories
位置加载一个文件spring-boot-autoconfigure-2.3.4.RELEASE.jar
包中的META-INF/spring.factories
配置会被读取org.springframework.boot.autoconfigure.EnableAutoConfiguration
配置项为自动配置类- 通过一系列
@Conditional***
实现按需装配 - 被
@EnableConfigurationProperties(xxx.class)
修饰的@Bean
方法参数中加上xxx
类型的参数,SpringBoot会读取配置文件实现定制化Bean
- 利用
最佳实践
- 引入场景依赖
- 查看自动配置类哪些
- 自己分析,引入场景对应的自动配置一般都生效了
- 配置文件中的debug=true开启自动配置报告,Negative(不生效)/Positive(生效)
- 是否需要修改
- 参照文档修改配置项
- 引入开发工具,实现热更新(实际上是重启,JRebel能实现真正的热更新,但是收费)
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
- IDEA中自定义配置文件自动提示,需要引入依赖,并且建议在打包插件中排除该依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.4.RELEASE</version>
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
yaml中单引号字符串会不转义,双引号字符串会转义,如:
'\n'
输出为\n
,"\n"输出为换行
Spring支持两种web开发模式
- 原生Servlet SpringMVC
- 响应式编程WebFlux