Spring Boot启动流程简析

本文深入分析了Spring Boot的启动流程,包括设计方向、注解使用、ApplicationContext的创建和刷新,特别是@Configuration注解的处理。重点讲解了SpringApplication.run()方法中的关键步骤,如BeanFactory的初始化、BeanDefinition的处理以及Bean的实例化和依赖注入。通过对Spring Boot启动流程的解析,有助于理解其内部工作机制。
摘要由CSDN通过智能技术生成

文章首发地址

Spring Boot的设计方向

  • 可以穿件独立的Spring应用程序,可以创建可执行的jars
  • 内嵌tomcat或jetty等Servlet容器
  • 提供“入门”依赖项,以简化构建配置。尽可能自动配置Spring和第三方库
  • 提供可用于生产的功能,例如指标、运行状况检查和外部化配置

Spring Boot注解

了解基本的启动注解

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@SpringBootConfiguration
@EnableAutoConfiguration
@ComponentScan(excludeFilters = {
    @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class),
		@Filter(type = FilterType.CUSTOM, classes = AutoConfigurationExcludeFilter.class) })
public @interface SpringBootApplication {
   
    ...

AnnotationUtil.java,该类会一级一级往上找

  • @SpringBootApplication
    • @SpringBootConfiguration
      • @Configuration
        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Configuration
        public @interface SpringBootConfiguration {
                 
            ...
        
    • @EnableAutoConfiguration
      • @Import(AutoConfigurationImportSelector.class)

          AutoConfigurationImportSelector是自动配置引入的选择器,它的任务是引入SpringBoot早已定义好的默认的一些Bean。包括SpringMVC涉及到的DispatcherServletAutoConfiguration和WebMVCAutoConfiguration(原本这些配置需要在bean.xml中手动配置)。——体现了Convention Over Configuration(约定优于配置)
        
        @Target(ElementType.TYPE)
        @Retention(RetentionPolicy.RUNTIME)
        @Documented
        @Inherited
        @AutoConfigurationPackage
        @Import(AutoConfigurationImportSelector.class)
        public @interface EnableAutoConfiguration {
                 
            ...
        
    • @ComponentScan(excludeFilters = { @Filter(type = FilterType.CUSTOM, classes = TypeExcludeFilter.class), @Filter(classes = AutoConfigurationExcludeFilter.class)}):
      • 第一个为用户自定义的指定类型排除过滤器
      • 第二个,当用户自定义了一个@Configuration配置类,并且在spring.factories配置文件中配置时,会被第二个过滤器排除
      @Retention(RetentionPolicy.RUNTIME)
      @Target(ElementType.TYPE)
      @Documented
      @Repeatable(ComponentScans.class)
      public @interface ComponentScan {
             
          ...
      

ApplicationContext

了解Spring应用上下文接口

  • 后面按顺序解读,主要需要关注SpringApplication.run()中的几个点:
    • createApplicationContext:创建应用上下文
    • prepareContext:向上下文注册一些bean
    • refreshContext:如果是tomcat,则调用AnnotationConfigServletWebServerApplicationContext的refreshContext()刷新上下文
      • 这一点在第三部分@Configuration注解中进行解读
  • 启动类
@SpringBootApplication
public class SpbtApplication {
   

    public static void main(String[] args) {
   
        
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Walter Sun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值