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

自定义SpringBoot的自动配置

一.前言

       SpringBoot通过自动配置实现了开箱即用的功能,极大方便了项目的开发,参照它的思路,我们是否也可以实现一个自定义的自动配置呢。

二.实现思路

1.自定义两个自动配置类

    @Configurationstatic class AutoConfiguration1{@Beanpublic Bean1 Bean1(){return new Bean1();}}
    @Configurationstatic class AutoConfiguration2{@Beanpublic Bean2 Bean2(){return new Bean2();}}

2.spring.factories文件配置

           其中有一个键为org.springframework.boot.autoconfigure.EnableAutoConfiguration,SpringBoot中通过这个键值来配置自定义的类

com.example.springdemo.demos.a04.TestAutoConfiguration$MyImportSelector=\
com.example.springdemo.demos.a04.TestAutoConfiguration.AutoConfiguration1,\
com.example.springdemo.demos.a04.TestAutoConfiguration.AutoConfiguration2org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.example.springdemo.demos.a07.TestMyBoot.AutoConfiguration1,\
com.example.springdemo.demos.a07.TestMyBoot.AutoConfiguration2

 3.在自定义的自动配置类上加@Import(AutoConfigurationImportSelector.class)

   SpringBoot是通过这个导入类导入自动配置文件的

    @Configuration@Import(AutoConfigurationImportSelector.class)static  class Config{}

进入AutoConfigurationImportSelector类,粗略看下实现原理

可以看到getAutoConfigurationEntry方法,获取配置。

点开getCandidateConfigurations方法可以看到具体实现

里面也是通过SpringFactoriesLoader.loadFactoryNames()加载配置文件。

打开this.getSpringFactoriesLoaderFactoryClass()可以看到它的加载的类EnableAutoConfiguration

者也是为什么要在配置类文件里面把自定义的配置类的键值配置为EnableAutoConfiguration的原因,只有这样在配合AutoConfigurationImportSelector便可以使用SpringBoot的自动配置配置我们的自定义类。

4.实战

package com.example.springdemo.demos.a07;import org.springframework.boot.autoconfigure.AutoConfigurationImportSelector;
import org.springframework.boot.autoconfigure.EnableAutoConfiguration;
import org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.DeferredImportSelector;
import org.springframework.context.annotation.Import;
import org.springframework.core.io.support.SpringFactoriesLoader;
import org.springframework.core.type.AnnotationMetadata;/*** @author zhou* @version 1.0* @description TODO* @date 2025/8/24 16:11*/
public class TestMyBoot {public static void main(String[] args) {AnnotationConfigServletWebServerApplicationContext context = new AnnotationConfigServletWebServerApplicationContext();context.registerBean("config", Config.class);context.refresh();for(String name : context.getBeanDefinitionNames()){String resource = context.getBeanDefinition(name).getResourceDescription();if(resource != null){System.out.println(name + "来源:"+resource);}}context.close();}@Configuration@Import(AutoConfigurationImportSelector.class)static  class Config{}/*static class MyImportSelector implements DeferredImportSelector{@Overridepublic String[] selectImports(AnnotationMetadata importingClassMetadata) {return SpringFactoriesLoader.loadFactoryNames(MyImportSelector.class,null).toArray(new String[0]);}}*/@Configurationstatic class AutoConfiguration1{@Beanpublic Bean1 Bean1(){return new Bean1();}}@Configurationstatic class AutoConfiguration2{@Beanpublic Bean2 Bean2(){return new Bean2();}}static class Bean1{}static class Bean2{}}

测试结果:

里面已经报错了,SpringBoot自动配置注解会做一个判断,不能通过直接使用@Import(AutoConfigurationImportSelector.class)的方式使用自动注入。

我们需要使用@EnableAutoConfiguration替代即可

已经正确导入我们自动配置的类了。

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

相关文章:

  • 从零到精通:如何用 Python 高效查找数组中出现频率最高的元素
  • leetcode刷题记录04——top100题里的7道中等题
  • 网络编程-创建TCP协议服务器
  • 后端Web实战-Java代码操作数据库
  • 跨摄像头追踪精度↑79%!陌讯动态决策模型在智慧园区的落地实践
  • 跨摄像头追踪准确率↑18%!陌讯时空感知算法在智慧安防的实战解析
  • 复杂场景鲁棒性突破!陌讯自适应融合算法在厂区越界检测的实战优化​
  • 使用Localtunnel搭建与外网交互简单的https本地服务器
  • 时序数据库选型“下半场”:从性能竞赛到生态博弈,四大主流架构深度横评
  • Windows 系统下 Android SDK 配置教程
  • 【数据结构与算法】并查集
  • 对象作为HashMap的key的注意事项
  • kubernetes集群搭建
  • 【贪心算法】day2
  • Golang云端编程入门指南:前沿框架与技术全景解析
  • 初探机器学习:从概念定义到前沿应用
  • 湖南(源点咨询)市场调研如何在行业研究中快速有效介入(尾篇)
  • mpv - write_video 流程解析
  • 从技术精英到“芯”途末路:一位工程师的沉沦与救赎
  • 暖色调街头人像摄影照片Lr调色教程,手机滤镜PS+Lightroom预设下载!
  • OpenHarmony Audio子系统全栈解码:从HDI驱动到DSP算法的低延迟高保真之路
  • SQL Server缩小日志文件.ldf的方法(适用于开发环境)
  • 复杂水域场景识别率↑89%!陌讯多模态融合算法在岸边垃圾检测的落地实践
  • Python学习笔记之(二)变量和简单的数据类型
  • 鸿蒙中Image白块问题分析与解决方案
  • Java:HashMap的使用
  • 2025/8/24 DockerDesktop安装使用
  • 云原生俱乐部-RH294知识点归纳(3)
  • Python内置函数全解析:30个核心函数语法、案例与最佳实践指南
  • Linux应急响应一般思路(二)