- 一,什么是springboot
- 二,import
- 2.1使用
- 三,springboot自动配置原理
- 3.1原理初探
- 3.2源码解析
- 四,总结
相当于一个脚手架,是一个成熟的框架,可以快速的开发一个项目。springboot配置好大量的bean,依旧是使用spring IOC的方式来管理bean。获取bean之后,通过反射的方式实现。
二,import 2.1使用1,@import(类)
2,实现ImportSelector接口。但是没有办法控制bean的顺序的问题,因此可以使用延时的DeferredImportSelector类,该类为ImportSelector接口的实现类,最后才会解析该类,并且该类底层实现了分组的功能。
3,实现ImportBeanDefinitionRegistrar接口
三,springboot自动配置原理 3.1原理初探首先会先通过这个@import导入一个DeffredImportSelector的选择器中,主要考虑这个类可以延时加载,在加载完所有的bean之后加载该类,就可以实现自定义的类了,然后全部交给spring.factories,从这个工厂中扫描所有的jar包,最后会将里面的字符串加入到List中进行排序,最后将这些bean交给spring容器进行管理。
3.2源码解析1,主启动类加上SpringBootApplication注解,说明这个类是SpringBoot的主配置类,SpringBoot 需要运行这个类的main方法来启动SpringBoot应用;
@SpringBootApplication
2,@EnableAutoConfiguration,开启自动配置注解
//设置当前注解可以标记在哪
@Target({ElementType.TYPE})
//当注解标注的类编译以什么方式保留
@Retention(RetentionPolicy.RUNTIME)
//java doc 会生成注解信息
@Documented
//是否会被继承
@Inherited
//表示该类是一个springBoot的一个配置类
@SpringBootConfiguration
//自动加载配置类
@EnableAutoConfiguration
//扫描包,相当于在spring.xml 配置中
@ComponentScan(
excludeFilters = {
//TypeExcludeFilter:springboot对外提供的扩展类, 可以供我们去按照我们的方式进行排除
@Filter(type = FilterType.CUSTOM,classes = {TypeExcludeFilter.class}),
//AutoConfigurationExcludeFilter:排除所有配置类并且是自动配置类中里面的其中一个
@Filter(type = FilterType.CUSTOM,classes = {AutoConfigurationExcludeFilter.class}
)}
public @interface SpringBootApplication()
3,使用了import,AutoConfigurationImportSelector可以实现延时和分组
@Import({AutoConfigurationImportSelector.class})
4,使用了AutoConfigurationImportSelector类,并且实现了DeferredImportSelector接口
class AutoConfigurationImportSelector implements DeferredImportSelector
5,该类中重写了getImportGroup方法,如果在该类中实现了这个分组的方法,就可以来实现自定义bean的分组。
public Class extends Group> getImportGroup() {
return AutoConfigurationImportSelector.AutoConfigurationGroup.class;
}
6,AutoConfigurationGroup具体实现也在这个DeferredImportSelector类下面
class AutoConfigurationGroup implements DeferredImportSelector.Group
7,上面的实现类最后调用这个process这个方法,进行配置问价你的加载
public void process(AnnotationMetadata annotationMetadata, DeferredImportSelector deferredImportSelector){
AutoConfigurationImportSelector.AutoConfigurationEntry autoConfigurationEntry = ((AutoConfigurationImportSelector)deferredImportSelector).getAutoConfigurationEntry(annotationMetadata);
}
8,getAutoConfigurationEntry方法中可以获取所有的属性,并且对需要加载的配置文件进行去重,过滤
//获取全部的属性 AnnotationAttributes attributes = this.getAttributes(annotationMetadata); //读取到所有的自动配置类,读取所有jar包的spring.factory的文件,以键值对方式存在 Listconfigurations = this.getCandidateConfigurations(annotationMetadata, attributes); //排除,主要通过LinkedHashSet实现 configurations = this.removeDuplicates(configurations); //根据EnableAutoConfiguration注解中属性,获取不需要自动装配的类名单 Set exclusions = this.getExclusions(annotationMetadata, attributes); this.checkExcludedClasses(configurations, exclusions); configurations.removeAll(exclusions); //过滤,看哪些配置类可以生效,哪些配置类不可以生效,匹配的类则生效 //@ConditionalOnProperty,@ConditionalOnBean,@ConditionalOnClass 判断类上面有没有 configurations = this.getConfigurationClassFilter().filter(configurations); this.fireAutoConfigurationImportEvents(configurations, exclusions); return new AutoConfigurationImportSelector.AutoConfigurationEntry(configurations, exclusions);
9,再调用selectImports方法进行排序,并且只会对当前组进行排序,不会影响整个spring容器的分类
public IterableselectImports(){}
10,排序完成就可以将bean交给IOC,用过beanFactory.getBean(),对bean进行实例化,属性填充和初始化。
四,总结首先通过一个**@import的一个注解,导入了一个 DeffredImportSelector**,它其中可以一个延时加载,可以在加载完其他bean之后再加载这个类,并且可以对bean进行分组,并且这个类可以批量注入beanDenefition,因此可以在spring.factories 中读取到所有jar包,最后存储在一个List中,并通过@ConditionalOnClass进行过滤,只有类上面有这个注解的可以通过,list里面有很多完整类的路径,最后将这些全部的类路径交给beanDefinitionMap中,最后交给beanFactory进行加工生产,通过IOC容器完成bean的实例化,属性填充,初始化等,最后加入到缓存中。因此sprintBoot所有的自动配置类都在启动类中扫描并加载。
@component和@import区别
component注册成bean需要在扫描范围之内,import不需要,而且import可以实现批量导入



