Springboot概述
springboot并非是一个全新的框架,而是在spring之上封装了一层。使用springboot能够非常快速的搭建系统,并且springboot的自动配置大大简化了开发流程,springboot还提供了大量注解,使得开发非常方便
创建独立的spring应用
springboot就可以创建独立的spring应用,它比用原生的spring Framework开发的应用更简单,配置更少
内嵌web服务器
以前开发web应用,会把项目打包成war包,然后部署到外部Tomcat运行项目,现在直接运行jar包即可
提供可选的start依赖,简化构建配置
启动器start,可以引入该场景下所有的包依赖,并且多个jar包对应的版本也会选择好
自动配置spring以及第三方插件
以前开发spring项目,有很多常规配置需要配置,并且引入其他技术时,都需要手动配置。有了自动配置以后,就不需要自己配置,创建好springboot项目后,只需要关注业务代码,而不必把注意力集中在大量繁琐的配置上
提供生产级别的特性
springboot自带了生产级别的指标和运行状态检查,可以很方便的查看服务运行的最新状况。并且当我们需要修改某些配置的时候,也不需要直接在项目源码上进行修改了,可以通过外部化配置,就可以将修改生效
完全不需要代码生成,也不需要XML配置
springboot是整合spring生态圈技术栈的一站式框架,是简化spring技术栈道快速开发脚手架
通过IDEA脚手架创建springboot项目
springboot依赖管理
自动配置介绍
springboot所有的自动配置都在spring-boot-autoconfigure包里面
默认包扫描路径
主程序Application.java所在的包及其下面的子包都会默认被扫描
当然,也可以自定义包扫描路径
如果想要类被扫描到,可以使用注解
@SpringBootApplication(scanBasePackages = "com.yang")
或者是
@ComponentScan("com.yang")
springboot配置文件
springboot配置文件支持两种类型的文件properties文件和yaml文件
两种文件的书写方式不同
- application.properties
yang.real-name=xiaoming
yang.age=20
yang.sex=1
teacher.name=cangjingkong
teacher.age=30
teacher.sex=0
- application.yaml
yang:
real-name:xiaoming
yage:20
sex:1
teacher:
name:cangjingkong
age:30
sex:0
常用注解
- @Configuration
定义配置类(Spring的配置是写在XML文件中,而springboot建议把配置写在配置类中) - @ComponentScan
定义包扫描路径 - @Bean
默认方法名就说bean的id,返回类型就是方法返回的类型。也可以使用@Bean(“xiaoming”),指定bean的名称 - @Import
给容器中自动创建出注解中指定类型的组件,默认组件的名字就是全类名 - @Conditional
满足Conditional指定的条件时,才向IOC容器中注入组件 - ImportResource
指定对应的xml文件,Spring就可以把xml中配置的Bean都加载到IOC中,而不用一个个的手写@Bean
自动配置特征介绍
@SpringBootApplication 注解源码解析
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM,classes = TypeExcludeFilter.class),@Filter(type = FilterType.CUSTOM,classes = AutoConfigurationExcludeFilter.class)})
public @interface SpringBootApplication {
}
@SpringBootConfiguration
@Configuration // 标注某个类是配置类
@Indexed
public @interface SpringBootConfiguration {
}
@ComponentScan
扫描配置类的注解
@EnableAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {
}
@AutoConfigurationPackage
static class Registrar implements ImportBeanDefinitionRegistrar, DeterminableImports {
@Override
public void registerBeanDefinitions(AnnotationMetadata metadata, BeanDefinitionRegistry registry) {
register(registry, new PackageImports(metadata).getPackageNames().toArray(new String[0]));
}
@Override
public Set<Object> determineImports(AnnotationMetadata metadata) {
return Collections.singleton(new PackageImports(metadata));
}
}
通过metadata获取到Application类,再调用getPackageNames()方法,获取到Application类所在的包,然后以PackageName作为注册bean的路径。
所以也就印证了主程序Application.java所在的包及其下面的子包都会默认被扫描到
@Import(AutoConfigurationImportSelector.class)
LoadFactory加载的是spring.factories,通过传进来的factoryTypeName来确定加载的所有的jar包中,如果有路径是META-INFO,并且有spring.factories的所有内容的集合里面,再获取key是EnableAutoConfiguration的靠右侧的识别类
代码写死了解析路径为META-INF/spring.factories
针对所有引⼊的jar中,包含路径为META-INF/spring.factories⽂件,进⾏循环解析(⼀共循环3 次)
第一次:/spring-boot-2.5.1.jar!/META-INF/spring.factories
第二次:/spring-boot-autoconfigure-2.5.1.jar!/META-INF/spring.factories
第三次:/spring-beans-5.3.8.jar!/META-INF/spring.factories
真正缓存到cache里面是以classLoader作为key,result解析所有配置文件作为value
- 自动配置按需加载原理
- @ConditionalOnClass是红色,说明这个类不在classpath中,无法初始化这个类。随着xxxAutoConfiguration的初始化,那么其中的bean也会注入到IOC中。
- @ConditionalOnClass是红色,说明这个类不在classpath中,无法初始化这个类。随着xxxAutoConfiguration的初始化,那么其中的bean也会注入到IOC中。
- 容错兼容
- 需要有这个类型的bean存在IOC中
- 要求IOC中没有指定name名称的bean
- 没有做任何处理就执行返回
- 其实这里是指,我配置了IOC中的这个类,但是名称起错了,不过没关系,这里把bean的名称改过来,还是叫multipartResolver
- 用户配置优先,外部配置项修改组件行为
-
- 默认用户配置
- 默认用户配置
- 查看自动配置情况
-
- 在配置文件中配置debug=true
springboot Web
静态资源访问
默认访问META-INF,public,resources,static,这4个文件夹
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {"classpath:/META-INF/resources/","classpath:/resources/", "classpath:/static/", "classpath:/public/" };
可以在配置文件中配置静态资源访问路径
spring:
mvc:
static-path-pattern: /static/**
web:
resources:
static-locations: [classpath:/yang/]
静态资源配置原理解析
Rest风格
请求路径使用@RequestMapping或者@xxMapping
是否使用REST | 获取用户信息 | 删除用户 | 更新用户信息 | 保存用户信息 |
---|---|---|---|---|
否 | /getUser | /deleteUser | /updateUser | /saveUser |
是 | /user method=GET | /user method=DELETE | /user method=PUT | /user method=POST |
携带method的表单提交
# 开启hiddenMethod过滤
spring:
mvc:
hiddenmethod:
filter:
enabled: true
Spring MVC请求映射原理
Springboot启动流程
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
ConfigurableApplicationContext context = SpringApplication.run(SpringbootDemoApplication.class, args);
}
首先会进入run方法
public static ConfigurableApplicationContext run(Class<?> primarySource, String... args) {
return run(new Class[]{primarySource}, args);
}
然后把所需要的设置初始化,调用run方法
public static ConfigurableApplicationContext run(Class<?>[] primarySources, String[] args) {
return new SpringApplication(primarySources).run(args);
}
初始化的内容
获取resourceLoader
getSpringFactoriesInstances是获取springfactories文件里面描述的类 的实例