1. 创建starter项目
依赖:基本依赖:spring-boot-starter,lombok,spring-boot-configuration-processor(配合spring-configuration-metadata.json在配置文件中生成提示信息)
2. 定义Starter需要的配置(Properties)类
@ConfigurationProperties(prefix = "spring.user")
@Data
public class UserProperties {
private String name;
private String sex;
private Integer age;
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
", age=" + age +
'}';
}
}
3. 编写自动配置类
@Configuration
//引入自定义的属性,不用这个也可以在UserProperties上面加上注解@Configuration,作用是一样的
//两个存在一个就行,就是让自定义的属性被spring管理
@EnableConfigurationProperties(UserProperties.class)
public class UserAutoConfigure {
@Bean
//更加细致的定义注入bean的条件,需要配置文件中包含spring.use.enabled=true,才会配置UserClient
@ConditionalOnProperty(prefix = "spring.user",value = "enabled",havingValue = "true")
public UserClient userClient(UserProperties userProperties) {
return new UserClient(userProperties);
}
}
public class UserClient {
@Getter
private UserProperties userProperties;
public UserClient(UserProperties userProperties) {
this.userProperties = userProperties;
}
@Override
public String toString() {
return "自动注入的userClient UserClient{" +
"userProperties=" + userProperties +
'}';
}
}
4. 编写spring.factories文件加载自动配置类
- 文件路径 resources/META_INF里面新建spring.factories文件,添加配置,这种配置方法默认就是加载启动,如果想要灵活的配置是否加载启动类,参考方法二
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.yu.starter_demo.UserAutoConfigure
- 自定义注解灵活加载启动类 ,在启动类上加上自己定义的注解@EnableUserClient就可以灵活配置加载启动类
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@Import(UserAutoConfigure.class)
public @interface EnableUserClient {
}
4. 编写配置提示文件spring-configuration-metadata.json(非必须)
文件写法可参考spring-boot-autoconfigure下的spring-configuration-metadata.json文件
{
"properties": [
{
"name": "spring.user.name",
"type": "java.lang.String",
"description": "用户名",
"sourceType": "com.yu.starter_demo.UserProperties",
"defaultValue": "LingLing"
},
{
"name": "spring.user.sex",
"type": "java.lang.String",
"description": "性别",
"defaultValue": "男"
},
{
"name": "spring.user.age",
"type": "java.lang.Integer",
"description": "年龄",
"defaultValue": 18
},
{
"name": "spring.user.enabled",
"type": "java.lang.Boolean",
"description": "是否自动装配userClient",
"defaultValue": false
}
]
}
添加这个文件的目的是为了让yml/properties的编写出现智能提示
注意事项:spring-configuration-metadata.json文件只当提示用,并不会真的生效。即比如我把spring.usr.sex的类型改成了boolean,在yml中会提示编译错误,但是不会影响项目的启动,同理在json文件编写的defaultValue属性值也只是作为一个显示参考,并不会真的生效。(另:json文件修改在yml中看到的效果会延迟比较多,所以不必特别注意这个,这个文件可写可不写)
5. 使用项目中引入依赖,增加配置即可使用
server:
port: 8070
spring:
user:
enabled: true
name: Xiaoyu
sex: 女
age: 10
@RestController
public class TestController {
@Resource
private UserClient userClient;
@GetMapping("/getUserClient")
public String getUserClient() {
return userClient.toString();
}
}