当前位置: 首页 > news >正文

SpringBoot自动配置原理(二)

1.通过SpringFactoriesLoader.loadFactoryName加载  EnableAutoConfiguration.class,读取SpringBoot自动配置类。

@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>");for(String name : SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,null)){System.out.println(name);}System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>");//返回配置类的类名List<String> names = SpringFactoriesLoader.loadFactoryNames(MyImportSelector.class,null);return names.toArray(new String[0]);}

读取到的是spring.factories文件下配置的类

2.遇到的问题

 同名的第三方bean导入失败, 以bean1为例测试。

package com.example.springdemo.demos.a04;/*** @author zhou* @version 1.0* @description TODO* @date 2025/8/15 21:32*/
public class Bean1 {private String name;public Bean1(String name){this.name = name;}@Overridepublic String toString() {return "bean1的name:" + name;}}
package com.example.springdemo.demos.a04;import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
import org.springframework.context.annotation.*;
import org.springframework.context.support.GenericApplicationContext;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.core.type.AnnotationMetadata;import java.util.List;/*** @author zhou* @version 1.0* @description TODO* @date 2025/8/15 21:30*/
public class TestAutoConfiguration {public static void main(String[] args) {GenericApplicationContext context = new GenericApplicationContext();//springBoot默认设置为false,同名的bean不允许第三方覆盖context.getDefaultListableBeanFactory().setAllowBeanDefinitionOverriding(false);context.registerBean("config",Config.class);//添加bean工厂后处理器context.registerBean(ConfigurationClassPostProcessor.class);context.refresh();for (String name:context.getBeanDefinitionNames()) {System.out.println(name);}System.out.println(">>>>>>>>>>>>>>>>>>>");System.out.println(context.getBean(Bean1.class));}@Configuration //本项目配置类@Import({MyImportSelector.class})static class Config{@Beanpublic Bean1 bean1(){return new Bean1("本项目");}}static class MyImportSelector implements ImportSelector{@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {/*System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>");for(String name : SpringFactoriesLoader.loadFactoryNames(EnableAutoConfiguration.class,null)){System.out.println(name);}System.out.println(">>>>>>>>>>>>>>>>>>>>>>>>>>");*///返回配置类的类名List<String> names = SpringFactoriesLoader.loadFactoryNames(MyImportSelector.class,null);return names.toArray(new String[0]);}}@Configurationstatic class AutoConfiguration1{@Beanpublic Bean1 bean1(){return new Bean1("第三方");}}@Configurationstatic class AutoConfiguration2{@Beanpublic Bean2 bean2(){return new Bean2();}}
}

如果本类的bean和自动配置类的bean是同名的话,SpringBoot会做以下设置,不允许第三方覆盖

context.getDefaultListableBeanFactory().setAllowBeanDefinitionOverriding(false);

      它先是使用了自动配置类里面的bean1,后面报错不能注册本地配置的bean1。如何解决这个问题?(配置类的bean1先使用,再是找本地类,这样是否合理)

3.解决办法

       导入类变为延迟加载的类 DeferredImportSelector(调整顺序,先找本地配置的bean,后找自动配置的bean,这样比较合理),延迟加载第三方配置,先让本类生效。

在第三方的bean上加上@ConditionalOnMissingBean注解
@Configurationstatic class AutoConfiguration1{@ConditionalOnMissingBean@Beanpublic Bean1 bean1(){return new Bean1("第三方");}}

结果如下:

本项目有的bean优选使用本项目配置的,如果缺失了再使用第三方的bean。

http://www.dtcms.com/a/334764.html

相关文章:

  • 智能客服、AI工作流、语音、聊天模板
  • MySQL的下载安装(MSI和ZIP版本都有)
  • 【Kubernetes系列】Kubernetes 中 Pod 层参数与 Deployment 层 Env 参数的区别与级别分析
  • WSL中占用磁盘空间大问题解决
  • 自适应阈值二值化参数详解 ,计算机视觉,图片处理 邻域大小 调整常数(C=3)和可视化调节参数的应用程序
  • 区块链技术原理(14)-以太坊数据结构
  • ubuntu更新chrome版本
  • 我的世界Java版1.21.4的Fabric模组开发教程(十九)自定义生物群系
  • 力扣(LeetCode) ——622. 设计循环队列(C语言)
  • 《C语言程序设计》笔记p10
  • 如何拿捏unittest自动化测试框架?
  • 代码随想录算法训练营四十三天|图论part01
  • 同创物流学习记录2·电车
  • 【手撕JAVA多线程】1.从设计初衷去看JAVA的线程操作
  • 【C++】STL 容器—list 底层剖析
  • Java应届生求职八股(5)---并发编程篇
  • JCTools 无锁并发队列基础:ConcurrentCircularArrayQueue
  • 【论文阅读笔记】--Eurosys--HCache
  • 安全审计-firewall防火墙
  • 探索粒子世界:从基础理论到前沿应用与未来展望
  • 基于动捕实现Epuck2的轨迹跟踪
  • 每日算法刷题Day62:8.16:leetcode 堆8道题,用时2h30min
  • 【Java基础面试题】数据类型
  • 【电路笔记 通信】AXI4-Lite协议 论文阅读 简化的高级可扩展接口(AdvancedeXtensibleInterface4Lite)
  • 小白挑战一周上架元服务——元服务开发06
  • 元宇宙教育:打破时空限制的学习革命
  • MQ迁移方案
  • 顶刊分享--MYC ecDNA增强胰腺癌的瘤内异质性及可塑性
  • 测试18种RAG技术,找出最优方案(四)
  • 云蝠智能VoiceAgent:AI赋能售后服务场景的创新实践