面试题心得--SpringBoot中自动配置的原理是什么?

深入解析SpringBoot自动配置原理
SpringBoot的自动配置原理主要涉及@Configuration、@EnabledAutoConfiguration、@ConditionOnClass等核心注解。@SpringBootApplication启动自动配置过程,通过扫描Pom.xml中依赖的spring-boot-autoConfigure模块,读取META-INF/spring.factories中的配置类。这些类经过过滤处理,根据条件判断生效,如@ConditionOnClass。开发者可以通过exclude属性排除不需要的自动配置类,参数调整可在application.xml中完成。

     spring boot的自动装配是通过几个核心注解实现的,@SpringbootApplication注解的底层代码中我们可以了解到有关自动配置的实验原理。包括@Configuration、@EnabledAutoConfiguration、@ConditionOnClass几大核心注解,在具体实施中,@EnableAutoConfuratuin会在我们Pom.xml配置导入的依赖中找到spring-boot-autoConfigure中的META-INF下面的spring-factories,将其中存在的类名以数组的形式返回到自动配置的实体类中进行过滤处理,再通过个自动配置类及自己的properties文件进行自动配置。

理解:

首先,我们在使用springboot时,需要对我们的对象新的类用@SpringBootApplication注解驱动,将该类标识为springboot的配置类,再通过springbootApplication的run方法,在执行过程中,springboot会导入相应的包并进行相关的注解驱动,过滤掉一些不满足条件的包。

我们可以点击@SpringBootApplication查看源代码,可以看到除了一些Target、Retent之类的元注解外,还有三个核心的注解,分别是SpringBootApplication将该类标识为配置类, ComponentScan自动扫描和EnableAutoConfiguration,其中EnableAutoConfiguration又包含AutoConfigurationPackage和Import,AutoConfigurationPackage中含有一个管理Bean对象的方法BeanDefinition,他会找到配置文件所在的包的位置并进行扫描,所以说配置文件的位置十分重要,关系到我们是否能够扫描到Controller等类的Bean对象,Import经过代码追踪到META-INF下面的spring-factories,里面存的全是可能要用的包的String类型的名字,将这些名字装在数组中,并在AutoConfigurationEntry方法下经过一系列操作,将重复导入的包名和我们不想用到的包名删掉,作为要自动配置的实体返回,通过反射机制将实体数组中代表的具体资源包进行下载,我们可以通过断点,来debug测试在过滤之前看看加载了多少包名,再看下过滤之后有多少包名,对于我们想要手动移除的类的,可以通过在配置类的@SpringBootApplication()中通过exclude A.class设置。一般来说,在spring-factories中是没有重复的包名的,而且一般来说我们在用springboot开发时也不会手动移除类,大多数类都是由Filter过滤的,在每个包名的底层中,都存在要满足的条件才不会被filter过滤掉,比如ConditionOnClass、ConditionOnBean等等,满足所有条件后才会生效,同时在springboot中也支持提供修改参数的方式,我们在Application.xml进行参数设置,一般通过前缀名.属性名进行设置。

总结,就是在spring-factories中有很多包名,以字符数组的形式返回到自动配置实体的方法中进行过滤,通过反射加载,如果由我们要用到但是被filter过滤掉的,我们在pom.xml导入相应的依赖,在涉及参数的修改时用前缀名加属性名在application.xml中配置,如端口号的配置,字符类型的设置。

### Spring Boot 自动配置实现原理 Spring Boot自动配置机制是其核心特性之一,旨在简化 Spring 应用的初始搭建和开发。它通过一系列条件判断和约定优于配置的原则,使得开发者可以在几乎不编写额外配置的情况下快速构建应用。 #### 条件注解的作用 在 Spring Boot 中,条件注解如 `@ConditionalOnClass`、`@ConditionalOnMissingBean` 等,用于控制 Bean 是否应该被创建[^1]。这些注解允许框架根据类路径上的存在与否或特定 Bean 的缺失来决定是否加载某个配置类或注册某个 Bean[^2]。 #### 启用自动配置 `@EnableAutoConfiguration` 注解是触发自动配置的关键。这个注解告诉 Spring Boot 开始查找并应用合适的自动配置类。通常情况下,该注解会被包含在 `@SpringBootApplication` 注解中,后者是一个组合注解,除了 `@EnableAutoConfiguration` 外,还包括了 `@SpringBootConfiguration` 和 `@ComponentScan`[^1]。 #### 配置文件的位置 所有自动配置类的全限定名都列在位于 `META-INF` 目录下的 `spring.factories` 文件中。当 Spring Boot 应用启时,它会读取此文件并加载列出的自动配置类。例如,在 `resources/META-INF/spring.factories` 中添加如下条目可以自定义自动配置类: ``` org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autoconfig.MyFeatureAutoConfiguration ``` 这表明可以通过修改 `spring.factories` 文件来自定义或扩展 Spring Boot自动配置行为[^5]。 #### 实际面试解答示例 如果要在面试中解释 Spring Boot自动配置原理,可以这样表述:Spring Boot 通过使用条件注解来检测类路径上的依赖项以及容器中的现有 Bean,进而决定哪些默认配置应当被激活。此外,`@EnableAutoConfiguration` 注解引导了整个自动配置过程,并且所有的自动配置候选类都在 `spring.factories` 文件中声明。这种设计不仅减少了手配置的需求,还提供了高度的灵活性,因为开发者可以根据需要覆盖默认设置或者提供新的自动配置选项。 ```java // 示例代码 - 模拟一个简单的条件注解使用 @Configuration @ConditionalOnClass({SomeService.class}) public class MyAutoConfiguration { @Bean @ConditionalOnMissingBean public SomeService someService() { return new DefaultSomeService(); } } ``` 在这个例子中,只有当 `SomeService` 类存在于类路径上,并且没有其他同类型的 Bean 已经被定义时,才会创建一个新的 `DefaultSomeService` 实例作为 Bean。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值