引言
在Spring Boot的世界中,Starter 能够简化我们的开发过程,通过封装常见的依赖和自动配置。本篇旨在为有志于进一步简化Spring Boot应用配置的开发者提供指导,让我们一起创建一个自定义
的Spring Boot Starter。
一、什么是 Spring Boot Starter?
Starter
是Spring Boot中的一个核心概念,它是一种依赖描述符,用于简化Maven或Gradle项目中的依赖管理和自动配置。Starter通常包含一组预定义的依赖项和一个或多个自动配置类,它们可以帮助开发人员快速启动和运行一个特定类型的应用程序。
Starter的工作原理如下:
- 依赖管理:Starter通过将常用库和框架组织在一起,简化了项目的依赖声明。例如,如果一个项目需要使用
Spring MVC
和Jackson JSON
库,只需添加spring-boot-starter-web
依赖即可,无需手动添加Spring MVC
和其他相关依赖。 - 自动配置:Starter中的自动配置类会根据项目的依赖关系和属性设置自动应用最佳实践配置。这些自动配置类通常位于
org.springframework.boot.autoconfigure
包中。例如,当添加spring-boot-starter-web
依赖时,Spring
Boot会自动配置嵌入式Tomcat
服务器和Spring MVC
相关的组件。 - 约定优于配置:Starter遵循Spring Boot的核心原则之一,即
“约定优于配置”
。这意味着,除非明确指定,否则默认配置将应用于项目。这有助于减少不必要的配置,并使项目更易于维护。
Spring Boot如何使用Starter来简化项目配置:
- 选择适当的Starter:根据项目需求,从Spring Boot提供的众多Starter中选择合适的依赖。例如,对于Web应用程序,可以添加
spring-boot-starter-web
;对于数据访问,可以添加spring-boot-starter-data-jpa
等。 - 添加依赖:在项目的构建配置文件(如pom.xml或build.gradle)中添加所选Starter的依赖。
- 自定义配置(可选):虽然Starter提供了许多
默认
配置,但开发人员仍然可以根据需要自定义
这些配置。这可以通过在项目的配置文件(如application.properties
或application.yml
)中覆盖默认值来实现。 - 编写业务代码:在Starter的帮助下,开发人员可以将更多精力投入到业务代码的编写上,而不是关注底层的配置细节。
二、自定义 Starter 的动机
- 特定领域的需求:当你的项目或产品需要针对特定领域进行优化,而现有的Starter
无法满足这些需求
时,创建自定义Starter就变得很有必要。例如,你的公司可能有一套特定的日志记录策略,或者需要集成一个特殊的安全框架,而这些都不是通用的Starter所能提供的。
- 封装复杂性:如果项目中有一些复杂的配置或组件集成,而这些配置经常需要在多个项目中
重复
使用,那么通过创建一个自定义Starter来封装这些复杂性,可以避免在每个项目中重复相同的配置代码,提高开发效率。 - 促进代码复用:在大型组织或企业中,可能有多个团队在不同的项目中工作。如果这些项目有共同的技术栈或依赖需求,创建一个自定义Starter可以帮助各个团队
共享
和复用
代码,减少重复劳动。 - 遵循最佳实践:有时候,组织内部可能已经形成了一套开发最佳实践,通过创建一个自定义Starter,可以将这些
最佳
实践固化并自动应用到所有新项目中,确保开发质量和一致性。 - 提供更好的开发者体验:自定义Starter可以为开发者提供更加友好的开发体验,例如通过
简化配置流程
、提供清晰的文档
和示例代码
,使得新加入项目的开发者能够更快地上手.
三、创建自定义 Starter
新建一个普通Maven项目:yu-spring-boot-starter
① 编写启动器
② 导入依赖
<!-- 引入Spring Boot自动配置依赖 ,用于自动配置应用程序的各种组件和功能.自定义starter时必须要有 -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-autoconfigure</artifactId>
</dependency><!-- 引入Spring Boot配置处理器,自定义starter时,调用方的配置文件中可以给出提示信息(如不引用,则不会提示,此包非必须) -->
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><!-- 表示两个项目之间依赖不传递:不设置optional或者optional是false,表示传递依赖;当出现依赖冲突时候,会自动剔除该依赖- --><optional>true</optional>
</dependency>
③ 添加属性类
如果你的Starter需要一些配置属性,你可以创建一个属性类来绑定这些属性。创建一个新的Java类,并使用@ConfigurationProperties
注解标记它为属性类。在该类中,定义你需要的属性,并提供相应的getter
和setter
方法。
/*** 将配置文件中以 "yu" 为前缀的属性值绑定到此Java类上* starter被引用时,会将驼峰命名的参数名称转化为全小写,并在原大写的前面添加"-",* 如本类的userName属性,yu.user-name来进行展现*/
@ConfigurationProperties(prefix = "yu")
public class User {private String userName;private String userPassword;//省略get/set...
}
④ 添加一个业务类
定义一个业务类,编写核心业务流程
public class UserServiceImpl {@Autowiredprivate User user;public String getUserInfo() {return user.getUserName() + "_" + user.getUserPassword();}
}
⑤ 自定义属性配置
需要创建一个自动配置类,用于配置和初始化我们的Starter。创建一个新的Java类,并使用@Configuration注解标记它为配置类。
@Configuration // 表示这个类为配置类
@EnableConfigurationProperties(User.class) // 启用 User 类的配置属性
public class YuStarterAutoConfiguration {// 在这里定义你要注册的对象@Bean@ConditionalOnClass(UserServiceImpl.class) // 只有当指定的类存在于类路径中时,才会创建该方法返回的 Beanpublic UserServiceImpl serviceStarterTest() {return new UserServiceImpl();}
}
⑥ 添加需要自动配置的配置类信息
在resources编写一个自己的 META-INF\spring.factories
# 自动配置,如果有多个配置则使用",\"结尾的方式即可
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.yu.config.YuStarterAutoConfiguration
⑦ 编译打包
maven–>clear–>install即可
⑧ 引用
新建一个SpringBoot 项目,导入我们自己写的启动器
<dependency><groupId>com.yu</groupId><artifactId>yu-spring-boot-starter</artifactId><version>1.0-SNAPSHOT</version>
</dependency>
编写一个 HelloController 进行测试我们自己的写的接口!
@RestController
@RequestMapping("test")
public class UserTestController {@Autowiredprivate UserServiceImpl userService;@RequestMapping("starter")@ResponseBodypublic String starter() {return userService.getUserInfo();}
}
编写配置文件 application.properties
yu.user-name=https://blog.csdn.net/m0
yu.user-password=53127626
启动项目进行测试,结果成功 !
https://blog.csdn.net/m0_53127626
四、总结
本文详细介绍如何自定义一个Spring Boot Starter。通过自定义Starter,我们可以将一些通用的功能封装起来,提高代码的复用性和可维护性。
希望本文对您有所帮助!