# starter-learn
**Repository Path**: GitFay/starter-learn
## Basic Information
- **Project Name**: starter-learn
- **Description**: 通过一个完整的实例学习自定义springboot-starter的项目
- **Primary Language**: Unknown
- **License**: AGPL-3.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 1
- **Forks**: 1
- **Created**: 2021-04-22
- **Last Updated**: 2022-06-09
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 通过一个完整的实例学习自定义springboot-starter
### 前言
> 在我们日常的开发过程中,使用第三方的组件比如Redis、OSS、Shiro、Swagger等等,有的只需要在配置文件里添加一些配置就能使用该组件了,是因为这些组件已经封装了starter了,而有的需要我们通过代码编写一些配置Bean才能使用,这样对于每一个项目接入使用都要写一遍配置,比较繁琐而且容易出错。\
> 另外在封装一些组件给其他项目引用时,如果提供starter对方接入就变得简单了,只需要在配置文件里加上配置就能自动装配好服务配置了。
示例代码:[https://gitee.com/GitFay/starter-learn](https://gitee.com/GitFay/starter-learn)
----------------
### 模块说明
+ `server`需要自动装配的模块,相当于我们引用的第三方服务包
+ `server-starter`自定义的starter模块,这个模块依赖`server`模块,实际使用时就是引入这个模块jar包
+ `web`使用starter的模块,这个模块引入`server-starter`模块,相当于我们自己的项目
### 实现效果
假设`server`的`TestConfig`、`TestConfigServe`需要自动装配,在其他项目需要使用`server`服务时,只需要引入封装好的`server-starter`依赖,写好配置文件,然后如下注入就可以使用了。
```java
@Resource
private TestConfig testConfig;
@Resource
private TestConfigServe testConfigServe;
```
### 自定义starter的实现
1. server-starter pom.xml
```xml
com.fay
server
0.0.1-SNAPSHOT
org.springframework.boot
spring-boot-configuration-processor
2.4.2
true
org.springframework.boot
spring-boot-autoconfigure
2.4.2
```
2. server-starter 配置类 ConfigProperties
```java
@Data
@ConfigurationProperties("learn")
public class ConfigProperties {
private boolean enable;
private String id;
private String name;
public ConfigProperties() {
this.enable = false;
}
}
```
3. server-starter 装配类 TestConfigConfiguration
```java
/**
* @ConditionalOn...相关注解的作用:在满足指定条件的时候才将某个 bean 装载到应用上下文中。
* @ConditionalOnClass:存在指定类时才装载
* @ConditionalOnProperty:prefix配置前缀, name属性名, havingValue属性值为该值时装载, matchIfMissing缺失属性时是否装载)
* @EnableConfigurationProperties注解的作用:启用自定义配置。
*/
@Configuration
@ConditionalOnClass(TestConfig.class)
@EnableConfigurationProperties(ConfigProperties.class)
@ConditionalOnProperty(prefix = "learn", name = "enable", havingValue = "true", matchIfMissing = true)
public class TestConfigConfiguration {
@Resource
private ConfigProperties configProperties;
/** 装配 TestConfig */
@Bean
@ConditionalOnMissingBean(TestConfig.class)
public TestConfig config() {
TestConfig testConfig = new TestConfig();
testConfig.setId(configProperties.getId());
testConfig.setName(configProperties.getName());
return testConfig;
}
/**装配 TestConfigServe */
@Bean
@ConditionalOnMissingBean(TestConfigServe.class)
public TestConfigServe serve() {
return new TestConfigServe(this.config());
}
}
```
4. server-starter resources/META-INF下的`spring.factories`
```bash
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.fay.learn.config.TestConfigConfiguration
```
5. resources/META-INF下的配置提示`additional-spring-configuration-metadata.json`(非必要,配置了之后web使用时可以提示配置)
```json
{
"properties":[
{
"name":"test.id",
"type":"java.lang.String",
"description":"ID"
},
{
"name":"test.name",
"type":"java.lang.String",
"description":"名称"
},
{
"name":"test.enable",
"type":"java.lang.Boolean",
"description":"开关",
"defaultValue":false
}
],
// 配置的可选值,非必要
"hints":[
{
"name":"learn.enable",
"values":[
{
"value":true,
"description":"enable元数据true"
},
{
"value":false,
"description":"enable元数据false"
}
]
}
],
// 配置分组,非必要
"groups":[
{
"sourceType":"com.fay.learn.ConfigProperties",
"type":"com.fay.learn.ConfigProperties",
"name":"learn",
"description":"group描述."
}
]
}
```
### web模块使用server模块
1. web pom.xml引入`server-starter`
```xml
com.fay
server-starter
0.0.1-SNAPSHOT
```
2. web application.yml,配置文件添加配置即可。
```yml
learn:
id: learn
name: 齐天大圣
enable: true
```
3. 启动web的服务,访问TestController下的接口验证装配是否成功。