栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

springBoot自动装配原理

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

springBoot自动装配原理

springboot自动装配原理
    • 一,什么是springboot
    • 二,import
      • 2.1使用
    • 三,springboot自动配置原理
      • 3.1原理初探
      • 3.2源码解析
    • 四,总结

一,什么是springboot

相当于一个脚手架,是一个成熟的框架,可以快速的开发一个项目。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 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的文件,以键值对方式存在
List configurations = 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 Iterable selectImports(){}

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可以实现批量导入

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/967348.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号