文章目录
1. 前置知识
在我们自定义starter的时候,先要了解 Springboot自动装配原理。
我们可以参照 mybatis-plus-boot-starter
源码来实现我们的自定义starter功能。
涉及案例代码:https://gitee.com/StarSea007/spring-boot-demo
2. 什么是starter?
Starter是一种用于简化依赖管理和配置的方式。它是一个预定义的依赖关系集合, 包含了一组常用的依赖和配置,以便于快速启动和构建特定类型的应用程序。
使用Starter可以大大简化项目的依赖管理和配置工作,提供了一种快速启动和构建特定类型应用程序的方式。
例如,Spring Boot提供了spring-boot-starter-web用于快速构建Web应用程序,它包含了常用的Web依赖(如
Spring MVC、Tomcat等)和相关的自动配置。
开发者也可以自定义自己的Starter,将常用的依赖和配置打包为一个Starter,方便在复用和共享。自定义
Starter可以提供一组特定领域的依赖和配置,以满足开发需求。
3. 常用的Condition注解说明
在加载自动配置类的时候,并不是将spring.factories的配置全部加载进来,而是通过@Conditional等注解的判断进行动态加载
@Conditional其实是spring底层注解,意思就是根据不同的条件,来进行自己不同的条件判断,如果满足指定的条件,那么配置类里边的配置才会生效。
常用的Conditional注解:
- @ConditionalOnClass : classp ath中存在该类时起效
- @ConditionalOnMissingClass : classpath中不存在该类时起效
- @ConditionalOnBean : DI容器中存在该类型Bean时起效
- @ConditionalOnMissingBean : DI容器中不存在该类型Bean时起效
- @ConditionalOnSingleCandidate : DI容器中该类型Bean只有一个或 @Primary的只有一个时起效
- @ConditionalOnExpression : SpEL表达式结果为true时
- @ConditionalOnProperty : 参数设置或者值一致时起效
- @ConditionalOnResource : 指定的文件存在时起效
- @ConditionalOnJndi : 指定的JNDI存在时起效
- @ConditionalOnJava : 指定的Java版本存在时起效
- @ConditionalOnWebApplication : Web应用环境下起效
- @ConditionalOnNotWebApplication : 非Web应用环境下起效
4. starter的命名规范
Spring官方Starter通常命名为 spring-boot-starter-{name}
如:spring-boot-starter-web
Spring官方建议非官方Starter命名应遵循 {name}-spring-boot-starter
的格式:如 mybatis-spring-boot-starter。
5. 自定义自己的starter流程
5.1 创建starter项目
自定义一个starter,名字是demo-spring-boot-starter。
5.2 添加依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
5.3 读取并注入配置信息
@Data
@ConfigurationProperties(prefix = "sea.person")
public class PersonProperties implements Serializable {
private String name;
private int age;
}
5.4 自定义业务类
public class PersonService {
@Autowired
private PersonProperties personProperties;
public String sayHello() {
return "Hello, name is "+ personProperties.getName() + ", age is " + personProperties.getAge();
}
}
5.5 编写自动配置类,把服务注入到Spring中
@Configuration
@EnableConfigurationProperties(PersonProperties.class)
@ConditionalOnClass(PersonService.class)
public class PersonAutoConfiguration {
@Bean
public PersonService personService(){
return new PersonService();
}
}
5.6 创建spring.factories文件
在资源目录下,创建文件META-INF\spring.factories,指定自动配置类的路径
org.springframework.beans.autoconfig.EnableAutoConfiguration=\
com.sea.config.PersonAutoConfiguration
反斜杠表示换行,太长了可以换到下一行。
5.7 把项目打成jar发布maven仓库
直接使用idea的maven功能进行打包
5.8 使用自定义的starter
5.8.1 创建一个springboot项目,导入依赖
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--自定义Starter工程-->
<dependency>
<groupId>com.sea</groupId>
<artifactId>demo-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
</dependencies>
5.8.2 在配置文件进行配置
sea.person.name=张三
sea.person.age=40
5.8.3 测试类
@RestController
public class PersonController {
@Autowired
private PersonService personService;
@GetMapping("/sayHello")
public String sayHello() {
return personService.sayHello();
}
}
如果有收获! 希望老铁们来个三连,点赞、收藏、转发。
创作不易,别忘点个赞,可以让更多的人看到这篇文章,顺便鼓励我写出更好的博客