SpringBoot 配置类解析

全局流程解析

配置类解析入口

postProcessBeanDefinitionRegistry逻辑

processConfigBeanDefinitions逻辑

执行逻辑解析

执行入口

ConfigurationClassPostProcessor.processConfigBeanDefinitions()方法中的do while循环体中

循环体逻辑

parse方法调用链

doProcessConfigurationClass

  • 处理内部类
  • 处理PropertySource注解
  • ComponentScan指定的路径进行扫描
  • 处理Import注解
  • 处理ImportResource
  • 转换bean的方法BeanMethod
  • 处理接口的默认方法
  • 处理父类

核心方法解析

内部类处理

org.springframework.context.annotation.ConfigurationClassParser#processMemberClasses

PropertySource处理

org.springframework.context.annotation.ConfigurationClassParser#processPropertySource

  • 用法:@PropertySource({"demo.properties"})
  • 遍历指定路径,替换占位符,加载资源
  • 将资源添加到environment

ComponentScan处理

  • @ComponentScan(basePackages = ({"pkgA","pkgB"}), basePackageClasses = ({A.class, B.class})
  • 没设置扫描路径的话使用配置类所在路径
  • 过滤顺序: excludeFilters -> includeFilters -> false

Import处理

  • ImportSelector.class & DeferredImportSelector.class
  • 处理以上两个接口实现selectImports返回的类名数组
  • DeferredImportSelector接口调用优先级低于其他接口
  • 处理ImportBeanDefinitionRegistrar实现中注册的bean
  • 处理@Import(A.class)

ImportResource处理

  • @ImportResource("xyz.xml")
  • 将注解属性值放入importedResources
  • 后续loadBeanDefinitionsForConfigurationClass中加载定义的bean

BeanMethod处理

  • 构造BeanMethod对象放入配置类属性中后续处理

接口默认方法处理

父类处理

  • 一: 不为null
  • 二: 全路径名不以java开头
  • 三: 尚末处理过

面试题

  • 配置类是什么?起到什么作用?
  • 请举例一些常用的配置注解?
  • 介绍下SpringBoot框架对配置类的一个处理流程?
  • 你能说出其中它其中的一些关键类和方法么?
  • 配置类的处理一般包括哪些内容?
  • 详细的一些注解处理过程?如Import注解?
### 确保Spring Boot配置类正确加载和生效 为了确保Spring Boot配置类能够被正确加载并生效,几个关键因素需要考虑: #### 配置类的定义与标注 配置类应当使用`@Configuration`注解来标记。这表明该类是一个提供bean定义的方法容器[^1]。 ```java @Configuration public class MyConfig { // Bean definitions here... } ``` #### 自动配置排除机制 有时默认的自动配置可能与自定义配置冲突,在这种情况下可以通过`@EnableAutoConfiguration`或其简化形式`@SpringBootApplication`上的`exclude`属性来禁用特定的自动配置项。 ```java @SpringBootApplication(exclude = {DataSourceAutoConfiguration.class}) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } ``` #### 条件化配置 利用条件注解(如`@ConditionalOnProperty`, `@ConditionalOnClass`等),可以根据运行时环境动态决定某些配置是否应该激活。这些条件注解都是基于更底层的`@Conditional`接口实现的[^4]。 ```java @Configuration @ConditionalOnProperty(name="my.feature.enabled", havingValue="true") public class FeatureConfig { @Bean public SomeFeature someFeature() { return new SomeFeature(); } } ``` #### 外部化配置优先级 对于外部化的配置文件(比如`application.properties`),它们的位置以及命名约定会影响最终的应用行为。特别地,`spring.config.name`、`spring.config.location` 和 `spring.config.additional-location` 属性用于指示额外的配置资源位置,需作为环境变量设定以影响启动过程中的配置解析逻辑[^2]。 #### 加载顺序与依赖管理 当存在多个配置类时,理解它们之间的加载顺序非常重要。可以借助于`@DependsOn` 或者`@Order` 注解来显式规定不同组件间的初始化次序。 ```java @Configuration @DependsOn("otherConfig") public class DependentConfig { @Bean public AnotherComponent anotherComponent(){ return new AnotherComponent(); } } ```
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值