整体流程:
加载-->装配-->注册
在写@Component注解的时候,有没有想过spring容器是怎么加载进去的?
一、加载
sprinboot项目启动需要加载的文件主要有两类,一类是starter组件及其他第三方组件;另一个是业务代码(包括2和3);
在springboot启动程序SpringApplication.run()方法中:
1)加载spring.factories文件
springboot 的SPI机制
load()
--->SpringFactoriesLoader.loadSpringFactories((@Nullable ClassLoader classLoader))
--->Enumeration urls = classLoader != null ? classLoader.getResources("META-INF/spring.factories") : ClassLoader.getSystemResources("META-INF/spring.factories")
-->Properties properties = PropertiesLoaderUtils.loadProperties(resource)
-->cache.put(classLoader, result)
2)加载当前启动类
将当前启动类作为一个beanDefinition注册到registry(注册表)中
loader.load()
-->load(GroovyBeanDefinitionSource source);
3)加载配置文件
SpringApplicationRunListeners listeners = getRunListeners(args) # 这个listeners中包含一个ConfigFileApplicationListener
-->ConfigFileApplicationListener.onApplicationEvent(ApplicationEvent event) # 监听事件并执行 onApplicationEnvironmentPreparedEvent((ApplicationEnvironmentPreparedEvent) event)
-->new Loader(environment, resourceLoader).load() # 最终完成加载