千家信息网

什么是SpringBoot的自动配置原理以及自定义SpringBootStarter

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇文章为大家展示了什么是SpringBoot的自动配置原理以及自定义SpringBootStarter,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。以Spr
千家信息网最后更新 2026年11月03日什么是SpringBoot的自动配置原理以及自定义SpringBootStarter

本篇文章为大家展示了什么是SpringBoot的自动配置原理以及自定义SpringBootStarter,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。

以SpringBootAdmin的实现方式作为参考

# 实现的效果:

  • 添加相关的依赖,再在启动类上加上@EnableXXX就可以使用相关的功能了。

# 原理-SpringBootAdmin为例

  • 在启动类上标记注解@EnableAdminServer

@EnableAdminServer@SpringBootApplicationpublic class AdminApplication {    public static void main(String[] args) {        SpringApplication.run(AdminApplication.class, args);    }}
  • 点进去发现只是导入了一个类AdminServerMarkerConfiguration.class

@Target(ElementType.TYPE)@Retention(RetentionPolicy.RUNTIME)@Documented@Import(AdminServerMarkerConfiguration.class)public @interface EnableAdminServer {}
  • 点进这个类AdminServerMarkerConfiguration发现只是向容器中添加了一个bean Marker

public class AdminServerMarkerConfiguration {    @Bean    public Marker adminServerMarker() {        return new Marker();    }    public static class Marker {    }}

  • 所以这一部分的总结就是:添加@EnableAdminServer注解,向容器中添加一个类型为 Marker的bean


  • 接下来找到AdminServerAutoConfiguration这个类,一般默认SpringBoot的自动配置类都是以XXXAutoConfiguration命名,所以很容易找到,例如RedisAutoConfiguration...

@Configuration@ConditionalOnBean(AdminServerMarkerConfiguration.Marker.class)@EnableConfigurationProperties(AdminServerProperties.class)@Import({AdminServerWebConfiguration.class})public class AdminServerAutoConfiguration { @Bean    @ConditionalOnMissingBean    public InstanceRegistry instanceRegistry(InstanceRepository instanceRepository,                                             InstanceIdGenerator instanceIdGenerator) {        return new InstanceRegistry(instanceRepository, instanceIdGenerator);    }    @Bean    @ConditionalOnMissingBean    public InstanceIdGenerator instanceIdGenerator() {        return new HashingInstanceUrlIdGenerator();    }......}
  • 解读这个类的注解可发现以下几点:

          @ConfigurationProperties("spring.boot.admin")      public class AdminServerProperties {        ...      }
    1. @Import({AdminServerWebConfiguration.class}) 导入另外一个配置类,向容器中添加其他bean

    1. @Configuration 这是一个配置类,可以看到这个类里面通过@Bean定义了很多bean

    2. @ConditionalOnBean(AdminServerMarkerConfiguration.Marker.class) [重点],判断容器中有这个bean,这就是上一部分,在启动类上添加@EnableAdminServer 的作用,当容器中有Marker这个bean时,这个Configuration才生效,才会向容器中添加这个类中定义的bean

    3. @EnableConfigurationProperties(AdminServerProperties.class) 启动配置类AdminServerProperties,将配置类与配置文件绑定


接下来的问题是:如何让Spring在启动的时候扫面到这个配置类呢,通过分析@EnableAutoConfiguration注解的实现可得知:将需要自动配置的类的全路径配置在META-INF/spring.factories,Spring会在启动的时候扫描类路径下所有的META-INF/spring.factories文件

  • 如SpringBootAdmin的配置:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\  de.codecentric.boot.admin.server.config.AdminServerAutoConfiguration,\  de.codecentric.boot.admin.server.config.AdminServerNotifierAutoConfiguration,\  de.codecentric.boot.admin.server.config.AdminServerHazelcastAutoConfiguration,\  de.codecentric.boot.admin.se  rver.config.AdminServerCloudFoundryAutoConfiguration


完成~

# 另外一个例子: 项目中Redis的自动配置

  • SpringBoot项目中使用Redis更加简单,添加Redis依赖即可使用

                  org.springframework.boot                spring-boot-starter-data-redis 

SpringBoot是如何实现添加了redis依赖就可以使用Redis,RedisTemplate的呢?

原理:
  • 永远第一步:找到Redis的自动配置类RedisAutoConfiguration

@Configuration@ConditionalOnClass(RedisOperations.class)@EnableConfigurationProperties(RedisProperties.class)@Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class })public class RedisAutoConfiguration {        @Bean        @ConditionalOnMissingBean(name = "redisTemplate")        public RedisTemplate redisTemplate(                        RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {                RedisTemplate template = new RedisTemplate<>();                template.setConnectionFactory(redisConnectionFactory);                return template;        }        @Bean        @ConditionalOnMissingBean        public StringRedisTemplate stringRedisTemplate(                        RedisConnectionFactory redisConnectionFactory) throws UnknownHostException {                StringRedisTemplate template = new StringRedisTemplate();                template.setConnectionFactory(redisConnectionFactory);                return template;        }}
  • @Configuration

  • @ConditionalOnClass(RedisOperations.class) 当类路径下有RedisOperations这个类时,那么很明显,这个类肯定是在添加redis依赖的时候导进来的,现在看一下这个类的路径。 确实是通过redis的起步依赖导进来的,这就是为什么添加了redis的起步依赖,redis就可以直接使用了

  • @EnableConfigurationProperties(RedisProperties.class) 激活配置类RedisProperties

@ConfigurationProperties(prefix = "spring.redis")public class RedisProperties {/**         * Database index used by the connection factory.         */        private int database = 0;        /**         * Connection URL. Overrides host, port, and password. User is ignored. Example:         * redis://user:password@example.com:6379         */        private String url;        /**         * Redis server host.         */        private String host = "localhost";        /**         * Login password of the redis server.         */        private String password;        /**         * Redis server port.         */        private int port = 6379;        ......  }
  • @Import({ LettuceConnectionConfiguration.class, JedisConnectionConfiguration.class }) 导入LettuceConnectionConfiguration和JedisConnectionConfiguration,这两个都是redis的客户端。 那么启用哪一个呢

  • LettuceConnectionConfiguration

@Configuration@ConditionalOnClass(RedisClient.class)class LettuceConnectionConfiguration extends RedisConnectionConfiguration {}
  • JedisConnectionConfiguration

@Configuration@ConditionalOnClass({ GenericObjectPool.class, JedisConnection.class, Jedis.class })class JedisConnectionConfiguration extends RedisConnectionConfiguration {}
  • 可以看到当类路径下有响应的客户端时,就启用相应的自动配置类

  • 而SpringBoot默认使用的是lettuce

上述内容就是什么是SpringBoot的自动配置原理以及自定义SpringBootStarter,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。

配置 容器 路径 原理 就是 注解 时候 接下来 下有 内容 只是 客户 客户端 技能 文件 知识 项目 明显 简明 简明扼要 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 厦门中拓互联网络科技有限公司 科技类互联网 互联网 科技创业 互联网金融科技创新 广西互联网科技公司 掌上梦互联网科技 互联网巨头投资的硬核科技 隆华科技工业互联网 团飞科技与伯堂互联网服务平台 茂名市互联网科技产业园 湖南诚度互联网科技有限公司 互联网金融中的现代科技 青岛科技大学互联网大赛研究生 移动互联网年度科技创新 996高科技互联网公司 伍佰万互联网科技怎么赚钱 35岁以上互联网科技行业 互联网科技包装股份有限公司上市 萌小萌互联网科技河南有限公司 广州全民伙伴互联网科技有限公司 互联网科技 中国互联网金融科技基金 滨湖区互联网智能科技产品供应 承德科技产业互联网发展 企晟互联网信息科技有限公司 华夏恒生科技与互联网科技 互联网科技快讯热点 山东大美朱楼互联网科技有限公司 互联网金融金融科技 黑龙江互联网科技公司
0