ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SpringBoot Starter 依赖相关总结

SpringBoot Starter 依赖相关总结 Spring Boot Starter 依赖相关总结一、Starter 的本质约定优于配置的工程化产物Starter 是一种「依赖聚合 自动配置」的打包规范。它的核心思想是把某一类功能所需的所有依赖、默认配置、自动装配逻辑打包成一个可插拔的模块。开发者只需引入一个 starter就能获得完整的功能能力。二、Starter 解决了什么痛点在没有 Starter 的传统 Spring 项目中集成一个中间件如 MyBatis需要!-- 1. 引入核心依赖 --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis/artifactIdversion3.5.9/version/dependency!-- 2. 引入 Spring 整合包 --dependencygroupIdorg.mybatis/groupIdartifactIdmybatis-spring/artifactIdversion2.0.7/version/dependency!-- 3. 引入数据库驱动 --dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.30/version/dependency!-- 4. 引入连接池 --dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.2.11/version/dependency!-- 5. 手写大量 XML / JavaConfig 配置 --注mysql:mysql-connector-java在 8.0.31 之后已迁移为com.mysql:mysql-connector-j新项目用新坐标。有了 Starter 之后dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.2.2/version/dependency一行搞定所有依赖 自动配置。这就是 Starter 的价值。三、Starter 的命名规范类型命名格式示例官方 Starterspring-boot-starter-*spring-boot-starter-web第三方 Starter*-spring-boot-startermybatis-spring-boot-starter自定义 Starter*-spring-boot-startermycompany-redis-spring-boot-starter⚠️ 官方独占spring-boot-starter-前缀第三方和自定义必须用*-spring-boot-starter后缀这是社区约定。四、Starter 的内部结构双模块设计一个规范的 Starter 通常由两个子模块组成my-starter/ ├── my-spring-boot-starter/ # ① 空壳 starter仅负责依赖聚合 │ └── pom.xml → 引入 autoconfigure 第三方依赖 │ └── my-spring-boot-autoconfigure/ # ② 自动配置模块核心逻辑 ├── pom.xml └── src/main/java/ ├── MyAutoConfiguration.java # AutoConfiguration ├── MyProperties.java # ConfigurationProperties └── META-INF/ ├── spring.factories # Spring Boot 2.7 之前 └── org.springframework.boot.autoconfigure.AutoConfiguration.imports # 2.7为什么拆成两个模块starter 模块只做依赖聚合无代码逻辑让使用者引入即可autoconfigure 模块包含自动配置类、条件注解、属性绑定等核心逻辑这种解耦的好处如果用户不想用自动配置可以只引 autoconfigure 模块手动装配。五、自动配置的核心机制5.1 前置AutoConfiguration与Configuration的区别自动配置类现在用AutoConfiguration2.7但它和普通Configuration还是有差异的对比项ConfigurationAutoConfiguration用途普通业务配置类专用于自动配置类发现方式ComponentScan组件扫描imports 文件加载官方约定不靠扫描排序控制无支持after/before属性Bean 方法代理proxyBeanMethodstrue默认proxyBeanMethodsfalse默认要点AutoConfiguration本质是Configuration(proxyBeanMethods false)的组合注解额外支持after/before排序。proxyBeanMethods false不代理Bean方法更轻量——自动配置类里 Bean 之间通常不互相调用不需要代理。2.7 之前自动配置类用Configurationspring.factories注册2.7 起推荐AutoConfiguration imports 文件。补充AutoConfiguration也组合了Configuration进而Component理论上能被扫描到但官方约定自动配置类不靠组件扫描、而靠 imports 文件加载且它们通常位于扫描路径之外。5.2 入口注册文件spring.factories→AutoConfiguration.importsSpring Boot 启动时扫描 classpath 下的注册文件加载自动配置类。精确时间线版本机制2.7 之前只认META-INF/spring.factories里的EnableAutoConfiguration2.7引入META-INF/spring/...AutoConfiguration.imports两者兼容spring.factories 标记废弃3.0彻底移除对spring.factories自动配置的支持只认 imports 文件# 2.7 之前META-INF/spring.factories org.springframework.boot.autoconfigure.EnableAutoConfiguration\ com.example.MyAutoConfiguration# 2.7 / 3.xMETA-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports com.example.MyAutoConfiguration注意spring.factories文件本身没废弃还用于ApplicationListener、EnvironmentPostProcessor等只是自动配置注册这一项迁移走了。5.3 条件装配Conditional家族自动配置类不会无条件生效而是通过条件注解控制AutoConfigurationConditionalOnClass(DataSource.class)// classpath 有 DataSource 才生效ConditionalOnProperty(prefixmy.datasource,nameenabled,havingValuetrue,matchIfMissingtrue)EnableConfigurationProperties(MyProperties.class)publicclassMyDataSourceAutoConfiguration{BeanConditionalOnMissingBean(DataSource.class)// 用户没自定义时才创建publicDataSourcedataSource(MyPropertiesprops){returnnewHikariDataSource();}}常用条件注解注解作用ConditionalOnClassclasspath 存在某类时生效ConditionalOnMissingClassclasspath 不存在某类时生效ConditionalOnBean容器中存在某 Bean 时生效ConditionalOnMissingBean容器中不存在某 Bean 时生效ConditionalOnProperty配置文件中某属性满足条件时生效ConditionalOnWebApplication是 Web 应用时生效细节ConditionalOnMissingBean不带参数时默认按方法返回类型匹配容器里没有该类型的 Bean 才创建。5.4 属性绑定ConfigurationProperties的三种注册方式ConfigurationProperties(prefixmy.datasource)DatapublicclassMyProperties{privateStringurl;privateStringusername;privateStringpassword;privateintmaxConnections10;// 默认值}要让上面的属性类真正生效被绑定有三种注册方式EnableConfigurationProperties(MyProperties.class)—— 显式声明最常用推荐ConfigurationPropertiesScan—— 扫描包下所有ConfigurationProperties类Component ConfigurationProperties—— 直接把属性类注册成组件5.5 自动配置排序多 starter 协作的关键多个自动配置类之间常有依赖关系必须控制加载顺序AutoConfigurationAutoConfigureAfter(DataSourceAutoConfiguration.class)// 在它之后加载AutoConfigureBefore(SecurityAutoConfiguration.class)// 在它之前加载AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE)// 或直接定顺序ConditionalOnClass(RedisClient.class)EnableConfigurationProperties(MyRedisProperties.class)publicclassMyRedisAutoConfiguration{// ...}为什么需要排序比如你的自动配置要注入一个DataSourceBean那就必须AutoConfigureAfter(DataSourceAutoConfiguration.class)否则 DataSource 还没创建、注入就失败了。六、自定义 Starter 的完整步骤假设我们要做一个my-redis-spring-boot-starterStep 1创建 autoconfigure 模块// MyRedisAutoConfiguration.javaAutoConfigurationConditionalOnClass(RedisClient.class)EnableConfigurationProperties(MyRedisProperties.class)publicclassMyRedisAutoConfiguration{BeanConditionalOnMissingBeanpublicRedisClientredisClient(MyRedisPropertiesprops){returnnewRedisClient(props.getHost(),props.getPort());}}// MyRedisProperties.javaConfigurationProperties(prefixmy.redis)DatapublicclassMyRedisProperties{privateStringhostlocalhost;privateintport6379;}Step 2创建 starter 模块空壳!-- my-redis-spring-boot-starter/pom.xml --dependenciesdependencygroupIdcom.example/groupIdartifactIdmy-redis-spring-boot-autoconfigure/artifactId/dependencydependencygroupIdio.lettuce/groupIdartifactIdlettuce-core/artifactId/dependency/dependenciesStep 3注册自动配置类# META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports com.example.redis.MyRedisAutoConfigurationStep 4使用dependencygroupIdcom.example/groupIdartifactIdmy-redis-spring-boot-starter/artifactIdversion1.0.0/version/dependencymy:redis:host:192.168.1.100port:6380Step 5可选但推荐生成配置元数据 metadata规范的 starter 会提供配置元数据让 IDE 在application.yml里写my.redis.时能自动补全、提示类型和默认值。引入注解处理器编译期自动从ConfigurationProperties生成元数据dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactIdoptionaltrue/optional/dependency编译后自动生成META-INF/spring-configuration-metadata.json也可手写additional-spring-configuration-metadata.json补充{properties:[{name:my.redis.host,type:java.lang.String,description:Redis 地址,defaultValue:localhost},{name:my.redis.port,type:java.lang.Integer,defaultValue:6379}]}七、常见官方 Starter 速查Starter功能spring-boot-starter-webWeb 开发Tomcat Spring MVCspring-boot-starter-webflux响应式 WebNetty WebFluxspring-boot-starter-data-jpaJPA 数据访问spring-boot-starter-data-redisRedis 操作spring-boot-starter-security安全认证spring-boot-starter-test测试支持JUnit Mockitospring-boot-starter-actuator监控端点spring-boot-starter-amqpRabbitMQspring-boot-starter-mail邮件发送八、使用 Starter 的注意事项版本管理交给 parent POM官方 starter 的版本由spring-boot-starter-parent统一管理不要手动指定版本第三方除外。排除不需要的依赖starter 可能引入你不需要的传递依赖用exclusions排除。自定义配置覆盖默认值通过application.yml修改属性或通过Bean覆盖自动配置的 Bean。关闭某个自动配置SpringBootApplication(exclude{DataSourceAutoConfiguration.class})Spring Boot 2.7 / 3.0 的注册方式变化自动配置从spring.factories迁移到 imports 文件2.7 引入、3.0 彻底移除自定义 starter 需注意兼容性。九、总结Starter 依赖聚合pom 自动装配AutoConfiguration 条件注解 属性绑定 约定优于配置。它是 Spring Boot「开箱即用」哲学的核心载体理解 Starter 就是理解 Spring Boot 的自动配置体系。
返回列表