详解SpringBoot启动流程

详解SpringBoot启动流程

1.SpringBoot启动做了什么事情?

Spring Boot 在启动时会完成以下工作:

  1. 加载应用程序的配置文件。Spring Boot 默认会加载 application.ymlapplication.properties 文件作为应用程序的配置文件,也可以通过 spring.config.namespring.config.location 属性指定其他的配置文件名称和路径。配置文件中的属性值会被解析为对应的 Java 对象,并作为 Bean 注入到应用程序上下文中。
  2. 创建应用程序的上下文环境(ApplicationContext)。Spring Boot 根据应用程序的依赖关系和配置信息,创建一个 ApplicationContext 对象,并将其中的 Bean 实例化和装配。
  3. 执行自动配置。Spring Boot 提供了大量的 Starter 和 Auto-Configuration 类,用于自动配置应用程序所需的各种组件,如 WebMVC、JPA、MyBatis、Redis、RabbitMQ 等。在启动时,Spring Boot 会根据应用程序的依赖关系和配置信息,自动装配相应的组件,并将其作为 Bean 注入到应用程序上下文中。
  4. 执行 CommandLineRunner 和 ApplicationRunner。这两个接口分别定义了在应用程序启动完成后需要执行的任务。可以通过实现这两个接口,编写自定义的启动任务,例如加载数据、初始化缓存等。
  5. 启动 Web 服务器。如果应用程序中包含 Web 组件,如 Spring MVC、Spring WebFlux 等,则会启动 Web 服务器,并将 Web 组件注册到服务器上。
  6. 运行应用程序。在完成以上步骤后,应用程序会开始运行,并监听来自客户端的请求。

总之,Spring Boot 在启动时会加载配置文件、创建 ApplicationContext、执行自动配置、执行启动任务、启动 Web 服务器,并运行应用程序。这些工作都由 Spring Boot 自动完成,开发人员只需要关注业务逻辑的实现即可。

2.SpringCloud的bootStrap配置文件什么时候加载?

Spring Boot 在启动时,会按照以下顺序加载配置文件:

  1. bootstrap.ymlbootstrap.properties,用于配置应用程序上下文的外部配置项。这些配置项会被加载到一个名为 bootstrapContext 的 ApplicationContext 中,该 ApplicationContext 是独立于应用程序上下文的。
  2. application.ymlapplication.properties,用于配置应用程序的内部配置项。这些配置项会被加载到应用程序上下文中,并覆盖任何在 bootstrap.ymlbootstrap.properties 中定义的相同配置项。

因此,bootstrap.ymlbootstrap.properties 文件会在应用程序上下文创建之前被加载。这些配置项主要用于配置应用程序上下文之外的资源,例如外部配置中心、加密密钥等。一般来说,我们只需要使用 application.ymlapplication.properties 文件来配置应用程序即可,而不需要专门创建 bootstrap.ymlbootstrap.properties 文件。

3.applicationContext和bootstrapContext是一个对象么?

它们虽然都是ApplicationContext类的对象,但是对象名称不一样,一个是bootstrapContext ,一个是applicationContext。

Spring Boot 会在启动时分别创建 bootstrapContextapplicationContext 两个不同的 ApplicationContext 对象,分别加载 bootstrap.ymlbootstrap.propertiesapplication.ymlapplication.properties 文件中的配置项。这样做的目的是为了让应用程序上下文与外部配置项隔离开来,从而增加系统的灵活性和可维护性。

bootstrapContextapplicationContext 两个上下文对象之间是有父子关系的。具体来说,applicationContextbootstrapContext 的子上下文。这样设计的目的是让 bootstrapContext 中的配置项能够被 applicationContext 继承并覆盖。当 applicationContext 中的配置项与 bootstrapContext 中的配置项发生冲突时,以 applicationContext 中的配置项为准。

需要注意的是,由于 bootstrapContextapplicationContext 之间是父子关系,因此在使用 @Autowired 注解注入 Bean 时,首先会在 applicationContext 中查找,如果找不到才会到 bootstrapContext 中查找。所以,如果我们希望某个 Bean 只在 bootstrapContext 中被使用,可以通过在该 Bean 上加上 @Primary 注解来覆盖掉 applicationContext 中的同名 Bean。

4.SpringBoot加载Bean的流程

Spring Boot 加载 Bean 时的主要步骤如下:

  1. 扫描应用程序包和所有依赖库中的 Bean 定义。
  2. 创建 Bean 定义,包括解析 Bean 的依赖关系、配置 Bean 的属性等。
  3. 实例化 Bean,包括调用构造方法或工厂方法等。
  4. 为 Bean 注入依赖,包括对其他 Bean 或资源的引用注入。
  5. 调用 Bean 的初始化方法,包括调用 @PostConstruct 注解标注的方法等。
  6. 将 Bean 注册到 Spring 应用上下文中,供其他 Bean 或组件使用。
  7. 应用关闭时,销毁 Bean,包括调用 @PreDestroy 注解标注的方法等。

在这些步骤中,Spring Boot 主要依靠 Spring 框架自身的功能来实现 Bean 的加载和管理。Spring Boot 还提供了一些自动配置的功能,可以根据应用程序的依赖关系和配置自动创建和配置 Bean,大大简化了应用程序的开发和部署。同时,Spring Boot 还支持使用外部配置文件来配置 Bean 的属性,方便了应用程序的配置和维护。

5.SpringBoot Bean生命周期

在 Spring Boot 应用程序中,Bean 的生命周期包括以下阶段:

  1. 实例化:当 Spring 容器加载配置文件并创建 BeanDefinition 对象时,会通过反射机制实例化 Bean 对象。此时,Bean 对象还没有被初始化,它的属性都还是默认值。
  2. 属性赋值:在实例化 Bean 对象后,Spring 容器会根据配置文件中的属性配置,将相应的属性值注入到 Bean 对象中。这些属性值可以来自于配置文件、其他 Bean 对象、注解等。
  3. 初始化:在属性赋值完成后,Spring 容器会调用 Bean 对象的初始化方法。可以使用 @PostConstruct 注解或者实现 InitializingBean 接口来指定初始化方法。在初始化方法中,可以进行一些初始化操作,例如建立数据库连接、初始化线程池等。
  4. 使用:在 Bean 对象初始化完成后,它可以被其他 Bean 对象或者应用程序调用,执行相应的业务逻辑。
  5. 销毁:当 Spring 容器关闭时,会调用 Bean 对象的销毁方法。可以使用 @PreDestroy 注解或者实现 DisposableBean 接口来指定销毁方法。在销毁方法中,可以进行一些清理操作,例如释放资源、关闭连接等。

总之,Spring Boot 应用程序中的 Bean 生命周期包括实例化、属性赋值、初始化、使用和销毁等阶段。在每个阶段中,可以使用不同的注解或者接口来指定 Bean 对象的行为。了解 Bean 的生命周期,有助于开发人员更好地理解和使用 Spring Boot 框架。

6.SpringBoot Bean加载顺序

Spring Boot 的 Bean 加载顺序并不是固定的,它与 Bean 的作用域、声明方式以及依赖关系等多个因素有关。一般来说,Spring Boot 会按照以下顺序加载 Bean:

  1. 先加载应用程序本身定义的 Bean,包括 @Component@Service@Repository@Controller@Configuration 等注解标注的类,这是通过@ComponentScan和@SpringBootConfiguration注解实现的。
  2. 再加载 Spring Boot 自动配置中定义的 Bean,这些 Bean 通常都是带有 @ConditionalOnXXX 注解的配置类,如 DataSourceAutoConfigurationWebMvcAutoConfiguration 等,这是通过@EnableAutoConfiguration注解实现的。
  3. 最后加载依赖中的 Bean,包括 Spring Boot Starter 中提供的依赖,这也是通过@ComponentScan注解实现的。

需要注意的是,这里的依赖中的 Bean 包括两种情况:

  • 一种是依赖中的 Bean 也可以称之为第三方 Bean,例如在依赖中引入了一个第三方库,它可能会定义一些 Spring Bean,并通过 @Configuration@ComponentScan 等注解将它们注册到 Spring 容器中。
  • 另一种是 Spring Boot Starter 中的 Bean,它们是在 Spring Boot 自动配置中定义的,但由于它们被打包在 Starter 中,所以也可以称之为依赖中的 Bean。这些 Bean 通常是带有 @ConditionalOnXXX 注解的配置类,如 spring-boot-starter-web 中的 WebMvcAutoConfiguration

需要注意的是,如果多个 Bean 的加载顺序会影响到程序的正确性,可以通过设置 @DependsOn 注解来控制它们的加载顺序此外,@DependsOn 注解可以指定某个 Bean 依赖于其他 Bean,从而确保它们在容器中的加载顺序。在一些特殊情况下,还可以通过实现 org.springframework.boot.ApplicationRunnerorg.springframework.boot.CommandLineRunner 接口来在应用程序启动时执行一些初始化操作。

7.SpringBoot程序中的Bean和自动装配的Bean会冲突么?

如果自定义的Bean与自动装配的Bean名称或类型相同,那么可能会发生自定义Bean被自动装配的Bean覆盖的情况。为了避免这种情况,可以在自定义Bean的注解上添加@Primary注解,表示该Bean是首选的,或者在自动装配的Bean上使用@Qualifier注解指定装配哪个Bean。另外,也可以在自定义Bean的注解上添加一个自定义的前缀,避免与自动装配的Bean名称或类型相同,从而避免Bean被覆盖的情况。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值