【视频笔记】SpringBoot自动装配的核心精髓到底是什么?

springboot自动装配到底有什么作用?有什么帮助,和普通配置到底有什么区别?

为什么中间件都会用自动装配来集成?(nacos、redis..)

先看普通配置,要求必须有Student对象存在,学校对象才会创建

 再创建个学生配置,里面注册了学生对象

 结果,只有student对象创建,学校对象school并没有创建。

普通配置不行,就再用自动装配试试。

把@Configuration注解去掉,再放入spring.factories自动装配文件中,成为自动装配类。

 结果:也只有student对象创建,自动装配也不好使啊

这就需要清楚@ConditionalOnBean的原理

beanDefinition

spring在创建一个对象时,不是直接就把一个对象创建出来,而是先获取创建对象的元信息

 包装成BeanDifinition结构,再放入一个BeanDefinition类型的map结构中

 等把所有元信息都放入该map后,接着再遍历这个map,把真正的对象创建出来。

 

ConditionalOnBean spring在启动时,会先拿到所有的配置类,包括普通的配置和自动装配配置,再挨个遍历

 列表中配置类加载的前后顺序。

在这个例子里就是学生配置和学校配置的遍历顺序。

默认是按照配置类名字在字母表中的顺序来排序的。

先加载学校配置、再加载学生配置

用代码来验证一下,在这两个配置类的构造方法中,都有相关的输出创建的信息

 看下结果,确实是学校配置比学生配置先加载

 回到spring遍历配置类列表的过程

 先遍历到学校配置,在配置中有方法是用@ConditionalOnBean修饰,那么就处理此方法,获取此注解里需要存在的对象,也就是学生对象

 判断spring容器中的beanDefinitionMap里,是否含有学生对象

 如果有的话,那就把学校对象放入beanDefinition中。但刚才说了,学生配置比学校配置后加载,现在处理的是学校配置,所以这时beanDefinition中还没有学生对象呢。那既然没有学生对象,那就表示ConditionalOnBean没有匹配到学生对象,那这个注入学校对象的方法,就不会把学校对象放入beanDefinition中

 指定加载顺序,想办法让学生配置比学校配置先加载,这就需要用到@AutoConfigureAfter, 把它放到学校配置上,并且注解里指定学生配置,意思是要在学生配置加载后,学校配置才会加载

 看一下结果,可以了

 再试一下,还是用@AutoConfigureAfterr,但不用自动装配,只用普通的配置还可以吗?

改一下,把自动装配文件去掉(Spring.factories),在配置类上再加上@Configuration成为普通配置,这时@AutoConfigureAfter确实失效了

这是因为只有执行自动装配,扫描出自动装配类后,才会执行AutoConfigureAfter来进行排序。

 

自动装配的精髓就在于,可以指定配置的加载条件和加载顺序

 可以看到nacos里有很多的自动装配配置,

 就拿其中的一个来看看

 

参考:SpringBoot自动装配的核心精髓到底是什么?_哔哩哔哩_bilibili

posted @ 2025-06-11 10:01  fanblog  阅读(11)  评论(0)    收藏  举报