spring整套源码系列之【springboot自动装配源码分析】
2024-04-10 18:47:59 0 举报
spring整套源码系列之【springboot自动装配源码分析】
作者其他创作
大纲/内容
标记了扫描的包,不指定默认扫描当前类包(启动类下的包路径)@ComponentScan
在@SpringBootConfiguration中使用的@EnableAutoConfiguration并没有配置需要排除的
springBoot启动的时候会创建启动类的bean
自动装配的关键所在@EnableAutoConfiguration
返回一个class路径数组,将创建beanselectImports(AnnotationMetadata annotationMetadata)
Enumeration<URL> urls = classLoader.getResources(FACTORIES_RESOURCE_LOCATION);
1:首先DeferredImportSelector从字面就能看出是延迟加载的,在spring解析的时候这个会最后解析,也就保证了我自动装配的那些bean是最后加载的,所以在@OnBeanCondition处理的时候就能判断当前是否存在我们自己写的bean,不存在才会帮我们创建
入口
排除完清理掉集合configurations.removeAll(exclusions);
我这是基于springboot2.4.4
原因二
@AutoConfigurationPackage
排重 configurations = removeDuplicates(configurations);
通过读取spring.factories 中的OnBeanCondition\\OnClassCondition\\OnWebApplicationCondition进行过滤
这里在解析@SpringBootConfiguration的时候其实已经不为空了,在初始化启动的时候已经读取完了,所以直接返回
读取spring.factories文件配置的org.springframework.boot.autoconfigure.EnableAutoConfiguration自动配置类
非空
空
原因一
@Import(AutoConfigurationImportSelector.class)
2:DeferredImportSelector存在一个Group的内部类,说白了就是可以把当前我们自动装配的bean放到这个Group中,然后再Group中队我们自动装配的bean进行排序,从而不影响到整个spring的顺序
判断是否为空result != null)
在这里就是获取到了自动配置的那个keyString factoryTypeName = factoryType.getName();
configurations = getConfigurationClassFilter().filter(configurations);
@SpringBootApplication注解
读取到添加进去返回
这里使用DeferredImportSelector而不使用ImportSelector?
AutoConfigurationPackages.Registrar里的方法就是注册了当前配置类所在包的bean,简单说就是保存了当前配置类包路径(就是启动类的包路径)
调用放回用创建需要自动装配的beanAutoConfigurationEntry autoConfigurationEntry = getAutoConfigurationEntry(annotationMetadata);
return result;
spring解析Import的时候会调用ImportSelector的selectImports(AnnotationMetadata annotationMetadata)
返回需要自动装配的类路径数组return StringUtils.toStringArray(autoConfigurationEntry.getConfigurations());
解析bean定义的时候会调用DeferredImportSelector.AutoConfigurationGroup的process方法,使用@Conditional派生注解对解析出的自动装配配置类进行选择哪些需要使用,也就是哪些需要装配bean哪些不要(在spring-boot-web的spring.factories文件中指明了100多个为第三方框架准备好的自动装配类,这些配置类在解析的时候都会加载成bean定义,然而里面有的是我们不需要的,所以它会根据@Conditional派生注解进行过滤,比如使用@OnClassCondition判断当前是否存在某个类,不存在表示我们没有引入依赖,当然就需要排除掉)
同样,他在需要的时候使用@OnBeanCondition来判断是否为我们创建bean又依赖于这里的顺序(我们引入的bean在自动装配的顺序之前)
扫描
声明为一个配置类@SpringBootConfiguration
0 条评论
下一页