欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 手游 > 从0~1写一个starer启动器

从0~1写一个starer启动器

2025/4/19 11:35:58 来源:https://blog.csdn.net/hubery_hubery/article/details/147284319  浏览:    关键词:从0~1写一个starer启动器

从0到1编写一个Spring Boot Starter

前言

使用过Spring框架的伙伴都知道,虽然Spring在一定程度上帮助我们简化了集成其他框架,但在集成框架的同时仍少不了大量的XML配置,这些繁琐的工作无疑会加重我们的工作任务。而Spring Boot相较于Spring的一个突出优势即为简化了大量繁琐的配置,采用约定大于配置原则,让程序员将更多的精力花费在业务上。

在一个基于Spring Boot搭建的Web项目中,我们常常使用spring-boot-starter-web这么一个启动器,它内部包含了Tomcat服务器和Spring MVC的相关功能及配置,我们可以直接使用其功能而不需要进行重复的默认配置。那么Spring Boot是如何实现这一功能的呢?

在理解其原理前,我们先来自己编写一个启动器~

第一步:创建Maven项目,添加必要的依赖

<dependencies><!-- 必要依赖 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId><version>2.7.0</version></dependency><!-- 配置元数据生成 --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><version>2.7.0</version><optional>true</optional></dependency>
</dependencies>

第二步:编写application.properties配置文件

demo.enabled=true
demo.name=hubery
demo.age=18

第三步:编写配置文件读取类

@ConfigurationProperties(prefix = "demo")
public class DemoProperties {private boolean enabled;private String name;private Integer age;// getters and setters...@Overridepublic String toString() {return "DemoProperties{" +"enabled=" + enabled +", name='" + name + '\'' +", age=" + age +'}';}
}

第四步:编写核心业务类

public class DemoService {private final DemoProperties properties;public DemoService(DemoProperties properties) {this.properties = properties;}public String getUserInfo() {return properties.toString();}
}

第五步:编写自动配置类

@Configuration
@EnableConfigurationProperties(DemoProperties.class)
@ConditionalOnClass(DemoService.class) // 当类路径存在该类时生效
@ConditionalOnProperty(prefix = "demo", value = "enabled", matchIfMissing = true)
public class DemoAutoConfiguration {@Bean@ConditionalOnMissingBean // 用户未自定义Bean时生效public DemoService demoService(DemoProperties properties) {return new DemoService(properties);}
}

第六步:注册自动配置类

对于Spring Boot 2.7以前的版本:

resources/META-INF下创建spring.factories文件:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.example.autoconfigure.DemoAutoConfiguration

对于Spring Boot 2.7+版本:

META-INF/spring下创建org.springframework.boot.autoconfigure.AutoConfiguration.imports文件:

com.example.autoconfigure.DemoAutoConfiguration

第七步:打包并安装

在项目根目录下执行命令:

mvn clean install

第八步:测试

新建一个Spring Boot项目,添加刚刚创建的依赖:

<dependency><groupId>com.example</groupId><artifactId>spring-boot-starter-demo</artifactId><version>1.0-SNAPSHOT</version>
</dependency>

Spring Boot 自动装配核心原理

1. 启动入口

@SpringBootApplication 复合注解包含:

@SpringBootConfiguration
@EnableAutoConfiguration  // 核心开关
@ComponentScan

2. @EnableAutoConfiguration 工作机制

  1. 收集阶段

    • 通过 AutoConfigurationImportSelector 扫描所有依赖的:
      • META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports(新)
      • META-INF/spring.factories(旧,兼容)
    • 合并所有声明的自动配置类
  2. 过滤阶段

    • 通过 @Conditional 系列注解进行条件筛选:
      @ConditionalOnClass       // 类路径存在指定类时生效
      @ConditionalOnMissingBean // 容器中不存在指定Bean时生效
      @ConditionalOnProperty    // 配置属性匹配时生效
      
    • 使用 AutoConfigurationImportFilter 进行最终过滤
  3. 注册阶段

    • 对符合条件的配置类进行排序(@AutoConfigureOrder
    • 按顺序注册到Spring容器

3. 现代版本的变化(Spring Boot 2.7+)

特性旧方式新方式
声明文件META-INF/spring.factoriesMETA-INF/spring/AutoConfiguration.imports
键名EnableAutoConfiguration无键名(每行一个全限定类名)
排序控制通过文件顺序@AutoConfigureBefore/After

如果觉得以上内容对您有帮助的话麻烦点一点小心心啦~

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词