学自: 【狂神说Java】SpringBoot最新教程IDEA版通俗易懂_哔哩哔哩_bilibili
学习框架
一、架构背景及演变
1.1单一应用架构(all in one)
将所有功能都部署在一起,以减少部署节点和成本。
用于简化增删改查工作量的数据访问框架(ORM)是关键。
单一架构 | 微服务架构 |
模块全都耦合在一块,代码量大,维护困难。 | 每个模块就相当于一个单独的项目,代码量明显减少,遇到问题也相对来说比较好解决。 |
模块都共用一个数据库,存储方式比较单一。 | 每个模块都可以使用不同的存储方式(比如有的用redis,有的用mysql等),数据库也是单个模块对应自己的数据库。 |
模块开发所使用的技术一样。 | 微服务每个模块都可以使用不同的开发技术,开发模式更灵活。 |
1.2垂直应用架构(MVC)
单一应用增加机器带来的加速度越来越小,提升效率的方法之一是将应用拆成互不相干的几个应用,以提升效率。此时,用于加速前端页面开发的Web框架(MVC)是关键。
1.3分布式服务架构(RPC)
将核心业务抽取出来,作为独立的服务,逐渐形成稳定的服务中心,使前端应用能更快速的响应多变的市场需求。此时,用于提高业务复用及整合的分布式服务框架(RPC)是关键。
1.4垂直应用架构(SOA)
当服务越来越多,容量的评估,小服务资源的浪费等问题逐渐显现,此时需增加一个调度中心基于访问压力实时管理集群容量,提高集群利用率。此时,用于提高机器利用率的资源调度和治理中心(SOA)是关键。
二、第一个SpringBoot程序
2.1 新建springboot项目
·spring官网>>springboot>>quickstart https://start.spring.io/
·下载解压用IDEA打开
或者
IDEA新建项目(一般开发都这样创建)
(spring https://start.spring.io/加载不了可以用阿里云https://start.aliyun.com/)
核心配置文件:(后面介绍yaml)
主应用:
简单接口:自动装配,原理见后文(只用写一个Controller,省去了很多配置)
通过package打包jar包,成功后保存在target中
在文件夹powershell打开,即可直接运行(文件夹shift+右键)
修改端口号:
小彩蛋:修改banner
2.2 自动配置原理:
1.pom.xml
·依赖
spring-boot-dependencies核心依赖在父工程中(按下图路径进入)
pom.xml中的
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.6.2</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
↓spring-boot-starter-parent中的
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>2.6.2</version>
</parent>
↓spring-boot-dependencies中的
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
我们在引入依赖时不需要指定版本,就是因为有这些版本仓库。
·启动器
2.主程序
·注解
SpringBoot项目无需各种配置文件,通过main方法启动SpringApplication类的静态方法run()来启动项目。
@SpringBootApplication是一个复合注解:
其中有三个注解是比较重要的:
①@SpringBootConfiguration:这个注解的底层是一个@Configuration注解(spring配置类),意思被@Configuration注解修饰的类是一个IOC容器,支持JavaConfig的方式来进行配置;再点进去是一个@Component(spring组件)。
②@ComponentScan:这个就是扫描注解的意思,默认扫描当前类所在的包及其子包下包含的注解,将@Controller/@Service/@Component/@Repository等注解加载到IOC容器中。
③@EnableAutoConfiguration:自动配置,这个注解表明启动自动装配,点进去如下:
@AutoConfigurationPackage(自动配置包)和@ComponentScan一样,也是将主配置类所在的包及其子包里面的组件扫描到IOC容器中,但区别是@AutoConfigurationPackage扫描@Enitity、@MapperScan等第三方依赖的注解,@ComponentScan只扫描@Controller/@Service/@Component/@Repository这些常见注解。所以这两个注解扫描的对象。
@Import是自动装配的核心注解:
其底层有一个selectImport方法:
该方法调用了getCandidateConfiguration(获取候选的配置):
其中,META-INF/spring.factories:就是自动配置的核心文件
spring.factories文件是一组一组的key=value的形式,其中一个key是EnableAutoConfiguration类的全类名,而它的value是一个xxxxAutoConfiguration的类名的列表,这些类名以逗号分隔如下
总结
springboot所有的自动配置都是在启动的时候扫描并加载:spring.factories所有的自动配置类都在这里面,只要导入对应的start,就有了对应的启动器,自动装配就可生效。
2.3 主启动类如何运行
SpringApplication类主要做以下事情:
1.推断应用的类型是普通项目还是Web项目。
2.查找并加载所有可用初始化器,设置到initializers属性中。
3.找出所有应用程序监听器,设置到listeners属性中。
4.推断并设置main方法的定义类,找到运行的主类。
三、Yaml语法学习
3.1 SpringBoot配置
yaml基础语法:
3.2 注入配置文件
1.yaml文件更强大的地方在于,他可以给我们的实体类直接注入匹配值。
以前:
①编写一个实体类Dog: (alt+insert 自动添加有参无参等...)
②为其赋值:(通过@Value)
③在测试类中测试:(@Autowired 自动装配)
现在:
使用yaml配置的方式进行注入
Person类:
在yaml中配置:
@ConfigurationProperties
注:若出现问题,需在pom中加入如下依赖
<dependency><groupId> org.springframework.boot </groupId><artifactId> spring-boot-configuration-processor </artifactId><optional> true </optional></dependency>
2.加载指定配置文件
@PropertySource: 加载指定的配置文件。
@configurationProperties: 默认从全局配置文件中获取值。
总结
JSR303数据校验
@validated
四、多环境配置及配置文件位置
1. 用properties配置
选择激活哪一个环境:
2. 用yaml配置
yaml可以通过---来切分成多个模块
五、自动配置原理
P12 待看