Spring Boot是如何扫描和加载bean的

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Spring Boot是如何扫描和加载bean的相关的知识,希望对你有一定的参考价值。

参考技术A 从SpringApplication#refreshContext方法开始追踪,找到
AbstractApplicationContext#invokeBeanFactoryPostProcessors方法,继续深入找到ConfigurationClassParser#doProcessConfigurationClass方法,就是从这里开始,根据ComponentScan配置的路径去加载需要spring管理的类。下面详细讲讲加载过程:

第一步,根据ComponentScan配置的路径去查找所有class文件,具体的方法在PathMatchingResourcePatternResolver#doRetrieveMatchingFiles,目的是扫描路径下每一个目录里的class文件。

第二步,过滤出使用了@Component注解的类,具体的方法在ClassPathScanningCandidateComponentProvider#scanCandidateComponents。

第三步,将第二步筛选出来的注册到bean工厂的注册表缓存中,具体的方法在ClassPathBeanDefinitionScanner#doScan

第四步,加载类里面的@Bean注解信息,并存放在配置缓存configurationClasses中,具体的方法在ConfigurationClassParser#processConfigurationClass

第五步,将第四步加载的@Bean信息注册到bean工厂的注册表缓存里,具体方法在
ConfigurationClassBeanDefinitionReader#loadBeanDefinitionsForBeanMethod

第六步,在refreshContext方法里有个finishBeanFactoryInitialization方法,在里面找到DefaultListableBeanFactory#preInstantiateSingletons方法,这里bean工厂将所有注册的bean都生成了实例。

bean工厂生成bean实例的步骤可以参考下面的文章
Spring Bean的生命周期: https://www.cnblogs.com/zrtqsk/p/3735273.html

spring boot 注解记录

@EnableConfigurationProperties

使被@ConfigurationProperties 注解的类生效。效果和在@ConfigurationProperties 注解的类上加@component注解相同。

@import

加载的资源扫描包之外的类

@Bean

需要在配置类中使用,即类上需要加上@Configuration注解,作用是将类注册为bean交由spring容器管理。

 

以上是关于Spring Boot是如何扫描和加载bean的的主要内容,如果未能解决你的问题,请参考以下文章

spring boot 注解记录

Spring Boot 之spring.factories

spring boot启动不扫描创建bean怎么回事

Spring Boot如何让自己的bean优先加载

spring Boot加载bean

Spring学习Bean的扫描注册