springboot启动类如下:
@SpringBootApplication public class SpringbootDemoApplication { public static void main(String[] args) { SpringApplication.run(SpringbootDemoApplication.class, args); } }
如何启动? 如何加载装配bean?
一:如何启动?
跟踪SpringApplication.run方法
其实主要功能就是创建SpringContext,并初始化,刷新等。 具体看一下:
createApplicationContext(): 使用java反射创建具体的容器
容器创建后开始bean的加载,跟踪prepareContext方法:
在做了一系列准备后,进入load方法
可以看到在load方法中,获取了一个BeanDefinitionLoader用来加载bean。 剩下的事情,就是spring中如何处理BeanDefinition了,包括刷新方法,也只是激活spring中的刷新方法。
所以,启动做的事情很简单,说白了就是创建容器,加载bean。 但是,加载哪个路径下的bean? pom中添加的依赖bean又是如何装配到容器,比如starter如何生效的?
二: 自动装配
进入@SpringBootApplication,看到有三个核心注解:
1、@SpringBootConfiguration: 其实就是spring的@Configuration,表明是一个配置类
2、@EnableAutoConfiguration:开启自动装配功能,是springboot的核心
有两个核心注解:@AutoConfigurationPackage: 使用Import注解给容器导入了Registrar
此类中有个registerBeanDefinitions方法,使用debug跟踪可以发现metadata中刚好是启动类的路径。所以@AutoConfigurationPackage的作用: 获取启动类路径,结合@ComponentScan注解扫描组件并注入容器 。@Import({AutoConfigurationImportSelector.class})在此类中![]()
![]()
![]()
![]()
可以看到加载了此路径下的spring.factories文件。 然后经过一系列的过滤,最终将里面配置的类通过反射,实例化为标注了@Configuration 的配置类,并加载到spring 容器所以,第三方jar包中类加载为spring容器的bean,需要在spring.factories文件中配置,并放在META-INF下。
3、
@ComponentScan
结合上面@AutoConfigurationPackage注解得到的启动类路径,扫描组件注入容器