Spring启动流程核心步骤:7、initMessageSource()

本文详细介绍了在应用程序上下文中初始化国际化资源的过程。通过检查容器内是否存在预定义的MessageSource Bean,如果存在则直接使用,若不存在则创建一个空的代理MessageSource,并将其注册为单例。此方法确保了应用能够正确处理国际化消息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

初始国际化资源

protected void initMessageSource() {
   ConfigurableListableBeanFactory beanFactory = getBeanFactory();
    //判断本地是否包含国际化相关(messageSource)的Bean。
   if (beanFactory.containsLocalBean(MESSAGE_SOURCE_BEAN_NAME)) {
      this.messageSource = beanFactory.getBean(MESSAGE_SOURCE_BEAN_NAME, MessageSource.class);
      // Make MessageSource aware of parent MessageSource.
      if (this.parent != null && this.messageSource instanceof HierarchicalMessageSource) {
         HierarchicalMessageSource hms = (HierarchicalMessageSource) this.messageSource;
        //如果在父的ApplicationContext中存在国际化资源,初始化到属性上
         if (hms.getParentMessageSource() == null) {
            // Only set parent context as parent MessageSource if no parent MessageSource
            // registered already.
            hms.setParentMessageSource(getInternalParentMessageSource());
         }
      }
    //如果容器中不存在,则生产默认的。
   }else {
      // Use empty MessageSource to be able to accept getMessage calls.
      DelegatingMessageSource dms = new DelegatingMessageSource();
      dms.setParentMessageSource(getInternalParentMessageSource());
      this.messageSource = dms;
      beanFactory.registerSingleton(MESSAGE_SOURCE_BEAN_NAME, this.messageSource);
   }
}

 

<think>嗯,用户想了解Spring Boot启动流程,分步骤的。首先,我需要回忆一下Spring Boot启动的基本过程。记得Spring Boot核心SpringApplication类,对吧?启动流程大致分为几个阶段:初始化、配置环境、创建应用上下文、刷新上下文等等。不过具体步骤可能需要更详细的分析。 首先,用户可能想知道从main方法开始,执行SpringApplication.run()的时候发生了什么。这时候应该初始化SpringApplication实例,加载应用上下文初始化和监听器。引用中提到了ApplicationContextInitializer,这可能是在准备阶段使用的回调接口,用来编程式初始化上下文,比如引用[2]里的内容。 然后,Spring Boot会准备环境,包括读取配置文件,比如application.properties或者application.yml。环境准备完成后,会创建应用上下文,这里可能需要区分Web应用和非Web应用,决定创建哪种类型的上下文,比如AnnotationConfigServletWebServerApplicationContext。 接下来是刷新应用上下文,这是Spring框架的核心步骤,包括bean的加载、依赖注入、后置处理器的调用等等。这里可能会涉及到自动配置,通过@EnableAutoConfiguration和spring.factories文件加载各种自动配置类。引用[1]提到了@SpringBootApplication注解,它组合了@Configuration、@EnableAutoConfiguration和@ComponentScan,所以自动配置的触发应该在这一步。 之后是调用ApplicationRunner和CommandLineRunner的run方法,这些接口允许在应用启动后执行一些代码。最后是启动完成,应用开始监听请求。 用户提供的引用中有提到ApplicationContextInitializer,还有初始化数据库schema的内容,比如引用[3]里的spring.integration.jdbc.initialize-schema,这可能是在上下文刷新阶段执行的一些初始化操作,比如数据库脚本的执行。 需要确保步骤描述清晰,并且正确引用提供的资料。可能还需要注意Spring Boot的自动配置机制,以及如何通过SpringFactoriesLoader加载配置,如引用[2]中的getSpringFactoriesInstances方法,这可能用于加载初始器和监听器。 另外,用户的问题中还提到生成相关问题,所以需要想几个相关的问题,比如启动流程中的关键扩展点,如何自定义初始化,或者自动配置的原理等。 可能还需要注意,用户提供的引用中有关于SpringApplication的scanBasePackages,这可能涉及组件扫描的配置,这部分在启动流程中的组件扫描阶段处理,由@ComponentScan注解控制,而@SpringBootApplication包含了这个注解。 总结一下,Spring Boot启动流程的主要步骤应该是: 1. 初始化SpringApplication实例 2. 准备环境 3. 创建应用上下文 4. 刷新上下文(包括bean加载、自动配置) 5. 执行Runner接口 6. 完成启动 每个步骤需要结合提供的引用中的内容,比如初始化阶段的ApplicationContextInitializer,自动配置通过spring.factories加载等。需要确保步骤准确,并且正确引用来源。</think>### Spring Boot启动流程分步解析 #### 1. 初始化阶段(SpringApplication构造) 当调用`SpringApplication.run(Application.class, args)`时: - 通过`SpringFactoriesLoader`加载`ApplicationContextInitializer`和`ApplicationListener`实现类[^2] - 检测应用类型(Servlet/Reactive/None),决定后续创建哪种应用上下文 - 通过`@SpringBootApplication`的`scanBasePackages`配置组件扫描范围[^1] #### 2. 环境准备阶段 ```java ConfigurableEnvironment environment = prepareEnvironment(listeners, applicationArguments); ``` - 加载`application.properties/yml`配置文件 - 激活指定的Profile配置 - 发布`ApplicationEnvironmentPreparedEvent`事件通知监听器 #### 3. 创建应用上下文 根据应用类型创建具体上下文实现: ```java // WEB应用创建 AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext(); ``` #### 4. 上下文刷新阶段(核心) 调用`AbstractApplicationContext.refresh()`方法: ```java // 关键步骤伪代码 prepareRefresh(); obtainFreshBeanFactory(); prepareBeanFactory(beanFactory); postProcessBeanFactory(beanFactory); invokeBeanFactoryPostProcessors(); registerBeanPostProcessors(beanFactory); initMessageSource(); initApplicationEventMulticaster(); onRefresh(); // 创建内嵌Web服务器 registerListeners(); finishBeanFactoryInitialization(beanFactory); // 初始化单例Bean finishRefresh(); // 发布ContextRefreshedEvent ``` #### 5. 后置处理阶段 - 执行`ApplicationRunner`和`CommandLineRunner`接口实现 - 完成数据库初始化(如配置了`spring.integration.jdbc.initialize-schema=embedded`)[^3] - Web服务器开始监听端口 #### 6. 启动完成 - 发布`ApplicationReadyEvent`事件 - 打印启动耗时和状态信息 ```mermaid graph TD A[Main方法] --> B[构造SpringApplication] B --> C[加载Initializers/Listeners] C --> D[准备环境] D --> E[创建应用上下文] E --> F[刷新上下文] F --> G[执行Runners] G --> H[启动完成] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值