1.SpringBoot特点
- 依赖管理
引入依赖默认都可以不写版本
引入非版本仲裁的jar,要写版本号。
- 自动配置
- 默认的包结构
○ 主程序所在包及其下面的所有子包里面的组件都会被默认扫描进来
○ 无需以前的包扫描配置
○ 想要改变扫描路径,@SpringBootApplication(scanBasePackages=“com.xxxx”)或者@ComponentScan 指定扫描路径
@SpringBootApplication
等于
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan("com.xxxx")
● 各种配置都拥有默认值
○ 默认配置最终都是映射到某个类上,如:MultipartProperties(XxxxxProperties)
○ 配置文件的值最终会绑定每个类上,这个类会在容器中创建对象
● 按需加载所有自动配置项
○ starter场景
○ 引入了的场景,它的自动配置才会开启
○ SpringBoot所有的自动配置功能都在 spring-boot-autoconfigure 包里面
2.容器功能
2.1、组件
- @Configuration
/**
* 1、配置类里面使用@Bean标注在方法上给容器注册组件,默认也是单实例的
* 2、配置类本身也是组件
* 3、proxyBeanMethods:代理bean的方法
* Full(proxyBeanMethods = true)、【保证每个@Bean方法被调用多少次返回的组件都是单实例的】
* Lite(proxyBeanMethods = false)【每个@Bean方法被调用多少次返回的组件都是新创建的】
* 组件依赖必须使用Full模式默认。其他默认是否Lite模式
*/
-
@Bean、@Component、@Controller、@Service、@Repository
-
@ComponentScan、@Import
@Import({XXX.class})
//导入第三方组件
- @Conditional
条件装配:满足Conditional指定的条件,则进行组件注入
@ConditionalOnBean: 容器中存在某个Bean组件时,加载指定代码
@ConditionalOnClass: 类路径下存在某个类时,加载指定代码
2.2、 配置绑定
- @ConfigurationProperties
/**
* 只有在容器中的组件,才会拥有SpringBoot提供的强大功能
*/
@Component
@ConfigurationProperties(prefix = "myproperties")
- @EnableConfigurationProperties
开启配置绑定功能,导入第三方包
3.自动配置原理
3.1引导加载自动配置类
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication{}
- @SpringBootConfiguration
- @ComponentScan
- @EnableAutoConfiguration
@AutoConfigurationPackage
@Import(AutoConfigurationImportSelector.class)
public @interface EnableAutoConfiguration {}
@AutoConfigurationPackage
@Import(AutoConfigurationPackages.Registrar.class) //给容器中导入一个组件
public @interface AutoConfigurationPackage {}
//利用Registrar给容器中导入一系列组件
@Import(AutoConfigurationImportSelector.class)
1、利用getAutoConfigurationEntry(annotationMetadata);给容器中批量导入一些组件
2、调用List<String> configurations = getCandidateConfigurations(annotationMetadata, attributes)获取到所有需要导入到容器中的配置类
3、利用工厂加载 Map<String, List<String>> loadSpringFactories(@Nullable ClassLoader classLoader);得到所有的组件
4、从META-INF/spring.factories位置来加载一个文件。
默认扫描我们当前系统里面所有META-INF/spring.factories位置的文件
spring-boot-autoconfigure-2.3.4.RELEASE.jar包里面也有META-INF/spring.factories
3.2按需开启自动配置项
按照条件装配规则(@Conditional),最终会按需配置。