1,@SpringBootApplication注解解析
1)定义一个类为Configuration类,并且开启EnableAutoConfiguration自动配置以及ComponentScan包扫描。
image.png等效于@Configuration、@EnableAutoConfiguration、@ComponentScan三个注解。
2)@Configuration
JavaConfig 形式的IOC容器配置类(class中声明多个bean方法,运行时经spring容器处理生成bean对象)。等效于<beans> ...</beans>;@Bean等效于<bean>...</bean>;<bean>的ref引用等效于@Bean方法的调用。
3)与Configuration相关注解:
1.@ImportResource 引入额外的xml文件。
2.@Import 引入额外的@Configuration修饰类。等效于<import/>
image.png
4)@ComponentScan
自动扫描和加载组件。等效于<context:component-scan>,可以使用basePackages指定扫描的包,默认扫描本类所在的package。扫描被@Component、@Repository、@Service等注解的类,将bean定义加载到ioc容器中。
image.png
5)@EnableAutoConfiguration
核心@Import(AutoConfigurationImportSelector.class),借助@Import,将收集和注册特定场景相关的bean定义,加载bean到ioc容器中。
收集需要导入的配置类
image.png
借助SpringFactoriesLoader,从指定配置文件(META-INF/spring.factories)加载配置。
从classpath下搜索META-INF/spring.factories配置文件,将Key为:org.springframework.boot.autoconfigure.EnableAutoConfiguration的配置项导入。
image.png
image.png
启动过程中会解析对应类配置信息,生成BeanDefinition,并加载到IOC容器的List中。
image.png
2,SpringApplication执行流程
1)ApplicationContextInitializer和ApplicationListener初始化
image.png
从MATA-INF/spring.factories获取类的全限定名,反射实例化。
image.png
2)run方法,获取classpath下MATA-INF/spring.factories中所有SpringApplicationRunListener,作为ApplicationStartingEvent发布
image.png
image.png
image.png
3)核心创建IOC容器
image.png
4)启动WebServer服务器
SpringApplication#refreshContext(context); -> 父类AbstractApplicationContext#refresh()方法 -> onRefresh();方法 -> 子类ServletWebServerApplicationContext#onRefresh() -> createWebServer()
image.png
5)listeners.started(context);
image.png
6)执行容器初始化,refreshContext(context)
image.png
网友评论