使用doLoadDocument方法将给定的InputSource解析为 DOM Document对象。这个Document对象代表了 XML 文件的结构。
通过调用registerBeanDefinitions方法,将解析得到的Document中的 Bean 定义注册到 Spring 的 Bean 工厂中。这个方法返回注册的 Bean 定义的数量。
如果日志级别设置为 DEBUG,则会记录加载的 Bean 定义数量。
这里重点是registerBeanDefinitions方法,继续跟踪代码
继续看重点,最终追到doRegisterBeanDefinitions方法
doRegisterBeanDefinitions(Element root) 方法是 Spring 框架中用于解析 XML 配置文件中的 Bean 定义并注册它们到 Spring 容器的方法。这个方法通常在 XML 文件读取并转换成 DOM(Document Object Model)树之后调用,此时 XML 文件的根元素通过参数 root 传递给这个方法。
代码提出来分析:
if (!this.getReaderContext().getEnvironment().acceptsProfiles(specifiedProfiles)) {
// 如果日志级别是DEBUG,则记录跳过文件的信息
if (this.logger.isDebugEnabled()) {
this.logger.debug("Skipped XML bean definition file due to specified profiles [" + profileSpec + "] not matching: " + this.getReaderContext().getResource());
parseDefaultElement(Element ele, BeanDefinitionParserDelegate delegate) 方法是 Spring 框架解析 XML 配置文件中默认命名空间(也就是没有前缀的 Spring 命名空间)元素的方法。这个方法专门处理 , , , 和 这几种标签。
“没有前缀的 Spring 命名空间” 是指那些元素?它们属于 Spring 的默认命名空间,但在使用时不需要指定命名空间前缀。如 , 或 ,这些元素都是没有前缀的,它们属于 Spring 默认定义的 XML 模式命名空间,默认命名空间通常在 XML 文件的顶部通过 xmlns 属性声明。
代码提出来分析:
processBeanDefinition方法是 Spring 框架中用于处理 XML 配置元素的方法。其目的是将 元素中描述的信息转换为 Spring 内部使用的BeanDefinition对象,并将其注册到 Spring IoC 容器中。这是 Spring bean 生命周期中的一个关键步骤,因为在这里定义的 bean 会在容器启动时被实例化和管理
代码提出来分析:
Spring Boot提供了actuator模块,其中/refresh端点可以用来重新加载配置(通常是与Spring Cloud Config结合使用)。这不是传统意义上的调用ApplicationContext的refresh方法,而是一种触发重新加载部分配置的机制,特别是标注了@RefreshScope的Bean,它们可以在不重新启动整个应用的情况下更新。