SpringBoot自动配置原理,看完恍然大悟
入口SpringBootApplication 的三合一主类上那个注解拆开看是三个SpringBootConfiguration、ComponentScan、EnableAutoConfiguration。前两个管配置类和包扫描真正的主角是第三个。EnableAutoConfiguration又导入了一个选择器AutoConfigurationImportSelector。自动配置的钥匙藏在这条导入链的尽头。没有它SpringBoot就退化成普通Spring。加载spring.factories 的清单选择器干的第一件事是去所有依赖的jar包里找META-INF/spring.factories文件SpringBoot 2.7之前或META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports2.7之后。这个文件里列了几百个自动配置类的全限定名。自动配置不是无中生有是提前写好的候选名单。每个starter都带一份你引入谁谁的名单就进池子。过滤条件注解的层层筛选候选名单有了但不可能全生效。每个自动配置类头上都顶着条件注解ConditionalOnClass、ConditionalOnMissingBean、ConditionalOnProperty。比如DataSourceAutoConfiguration要求类路径有DataSource且你没自己定义DataSource的Bean。条件注解是自动配置的守门人不满足条件一律拦在门外。这就是为什么你加了依赖却没配URL它也不报错只是不生效。生效按需装配不抢你的活满足条件的配置类才会被解析成Bean定义。但SpringBoot有个原则你定义的Bean优先自动配置的Bean兜底。你写了一个Bean的DataSource自动配置就退让。你没写它才补上。这叫“约定优于配置”也叫“你不说话我替你决定你开口我听你的”。自动配置的智慧在于知道什么时候不该动。它不是替你当家是替你打下手。配置绑定ConfigurationProperties 的桥自动配置类里常常用EnableConfigurationProperties激活一个属性类。你写在application.yml里的spring.datasource.url就是通过ConfigurationProperties(prefix spring.datasource)绑到对象上的。没有配置绑定自动配置就是个空壳有了绑定它才能读懂你的心思。你改一行配置它换一套行为这就是外部化配置的威力。调试看自动配置报告你可以在启动参数加--debug控制台会打印CONDITIONS EVALUATION REPORT。哪些配置生效了哪些没生效为什么没生效一清二楚。看不懂自动配置不是它太神秘是你没打开那盏灯。学会看报告排查问题从猜变成看效率翻倍。恍然自动配置的本质是条件装配说到底SpringBoot自动配置没用什么黑科技。它就是一套基于条件注解的批量Bean注册机制把大量可复用的配置类提前写好按需加载。你恍然大悟的那一刻不是懂了某个类而是懂了Spring的一贯哲学约定、条件、可覆盖。这套哲学让SpringBoot从“配置地狱”里把你捞了出来。下次再遇到自动配置不生效别慌顺着条件注解往回查答案就在那里。
上一篇/下一篇内容由系统自动关联
返回资讯列表 →