springboot源码分析--自动配置流程

前言:在上一个文章当中我们发现,spring.factories当中加载了124项配置信息,那么springboot把这124项候选配置信息全部导入到容器里了吗?其实并不是。接下来我们分析springboot的自动配置流程。


springboot批量导入的配置信息有没有全部生效,接下来我们来验证一 下。

AOP相关的配置类

markdown 复制代码
      在加载候选配置信息的时候,也是加载了的aop的相关配置类。

当我们进入到这个配置类当中发现,AopAutoConfiguration配置类需要生效,需要满足很多条件

那这个配置类是否加载到ioc容器当中呢,我们验证一下

js 复制代码
@SpringBootApplication
public class App {
  public static void main(String[] args) {
    //获得ioc容器
    ConfigurableApplicationContext context =
SpringApplication.run(App.class, args);
    //根据bean的类型,获取容器中bean的名称
    String[] beanNamesForType =
context.getBeanNamesForType(AopAutoConfiguration.class);
    System.out.println(beanNamesForType.length);// 值
为1 说明这个bean已经在ioc容器中存在。
 }
}

可以看到获取到了他的名称,所以这个配置类是在ioc容器里面生效了的。

我们进入这个配置类继续观察,我们发现这个配置类的内部也在注入一些 组件:

但是我们搜索发现,容器中并不存在org.aspectj.weaver.Advice这个 bean!!!说明AspectJAutoProxyingConfiguration这个bean并没有注入 到容器中。也就是说配置类不一定要加载进容器当中也能实现。


那么我们再来看看缓存相关的配置类CacheAutoConfiguration

CacheAutoConfiguration有没有导入到IOC容器,其实在加载候选配置信 息的时候,已经导入了的。

我们打开这个配置类:

我们发现,CacheAutoConfiguration配置类需要生效,同样需要满足很多 条件。 @Configuration(proxyBeanMethods = false) 标识当前类是一个配置 类。 @ConditionalOnClass({CacheManager.class}) 条件注入,意思是当 前配置类生效,类路径下必须存在CacheManager这个类,容器中存在 吗?我们可以搜索一下:

@ConditionalOnBean({CacheAspectSupport.class}) 条件注入,意思 是当前配置类生效,容器中必须存在CacheAspectSupport这个bean。 我们可以测试一下容器中是否存在这个bean。

@SpringBootApplication 复制代码
public class App {
  public static void main(String[] args) {
    //获得ioc容器
    ConfigurableApplicationContext context =
SpringApplication.run(App.class, args);
    //根据bean的类型,获取容器中bean的名称
    String[] beanNamesForType =
context.getBeanNamesForType(CacheAspectSupport.class);
    System.out.println(beanNamesForType.length); // 0
 }
}

容器中没有这个bean 其实看到这里,我们就不用往下看了,因为CacheAspectSupport这个 bean在ioc容器中不存在,所以当前的配置类CacheAutoConfiguration也 不会生效。所以批量导入的配置信息不一定被加载到容器当中,具体要看该配置类的条件是否成立。如果条件满足则会被导入到容器当中。

相关推荐
码事漫谈1 小时前
三步改掉 AI 味,附可直接复制的去 AI 味提示词
后端
IT_陈寒1 小时前
Redis卡顿的锅,这次真不是大key的错
前端·人工智能·后端
可乐鸡翅yeah_2 小时前
video.js 集成 hls.js 开发 M3U8 播放器,新手高频踩坑
开发语言·前端·javascript·后端·ecmascript·m3u8·音视频在线播放
ly76892 小时前
Spring Boot 集成 Elasticsearch 的生产实践:客户端选型、索引生命周期与批量写入容错
spring boot·elasticsearch·索引生命周期·java api client·批量写入
程序猿_极客2 小时前
【免费】分享一套优质的基于SpringBoot的服装商城管理系统的设计与实现(带可视化图表、协同过滤功能),源码+文档+视频详解(讲解)
java·spring boot·后端·服装商城管理系统
明月_清风2 小时前
面对陌生的 GitHub 项目无从下手?这 4 个网站帮你快速读懂源码
前端·后端·github
bug菌3 小时前
🤔同事突然问我:Spring的注解 @Component 和 @Service 有何不同?
java·spring boot·后端
leobertlan3 小时前
痛苦系列 | DSP-02 频域切片:DTFT与DFT的探索
android·后端
加我攻城狮3 小时前
当大模型把「景区」定位到附近公共厕所:我的 AI 旅行小程序踩坑实录
后端·微信
Lonely丶墨轩3 小时前
用 Vue + Spring Boot + Python 做一个 AI 双人海龟汤游戏:从出题、联机到自动审稿等核心技术设计与实现
spring boot·后端·游戏