前言
SpringBoot 的核心理念就是 “约定大于配置”,这一理念最终是通过开箱即用的 Starter 模块来实现的。
例如想要在 SpringBoot 项目中集成 Redis,那么只需要加入 spring-data-redis-starter 的依赖,并简单配置一下连接信息就可以。这为我们省去了之前很多的配置操作。
编写 Starter Demo
创建一个 Gradle 项目:demo-spring-boot-starter
引入以下依赖:
dependencies {
compile 'org.springframework.boot:spring-boot-autoconfigure'
compile 'org.springframework.boot:spring-boot-configuration-processor'
}
属性类
新建属性类 CustomProperties。通过 @ConfigurationProperties 注解指定这是一个配置类,并设置注解的 prefix 属性值指定配置项的前缀。
@ConfigurationProperties(prefix = "demo.springboot.starter")
public class CustomProperties {
private String herb = "default";
public String getHerb() { return herb; }
public void setHerb(String herb) { this.herb = herb; }
}
服务接口
定义一个服务类 CustomService 供引用该 Starter 的工程调用,提供 sayHello 方法用于测试输出。
public class CustomService {
private CustomProperties customProperties;
@Autowired
public void setCustomProperties(CustomProperties customProperties) {
this.customProperties = customProperties;
}
public String sayHello(String name) {
return String.format("This is %s speaking, my favourite kind of herb is %s.", name, customProperties.getHerb());
}
}
自动配置类
在 Starter 中,会有若干 AutoConfiguration 类,这些类会通过定义的配置进行一些初始化工作,可能是初始化一些Bean,也可能是执行一些业务逻辑。
@Configuration 指明该类是一个 JAVA Config 类;@EnableConfigurationProperties 启用自定义的配置类,这样这个配置类才会被自动装配。
@Configuration
@EnableConfigurationProperties(CustomProperties.class)
public class CustomAutoConfiguration {
@Bean
public CustomService customService() {
return new CustomService();
}
}
在 src/main/resource/META-INF 目录下创建配置文件 spring.factories。Spring 内部使用一种工厂加载机制 (Factory Loading Mechanism),这种机制通过 SpringFactoriesLoader 完成,后者通过检索这个文件中的内容,获取到指定的配置类,或是对相应的 Bean 进行有选择 (@ConditionalOnXxx) 的实例化。
# 自动初始化配置
org.springframework.boot.autoconfigure.EnableAutoConfiguration=cn.caplike.demo.CustomAutoConfiguration
上传 Starter
我们需要将自定义的 Starter 上传到内部仓库或者本地仓库才能供其他工程依赖。
本文以本地仓库作示范,修改 build.gradle 文件,新增任务 uploadArchives:
运行 uploadArchives 即可上传到本地仓库。
使用自定义 Starter
新建 Web 测试工程并编写入口类以打印配置内容:
@SpringBootApplication
public class SampleApplication {
private static CustomService customService;
public static void main(String[] args) {
SpringApplication.run(SampleApplication.class);
System.out.println(customService.sayHello("caplike"));
}
@Autowired
public void setCustomService(CustomService customService) {
SampleApplication.customService = customService;
}
}
启动 Web,可以看到控制台输出:This is caplike speaking, my favourite kind of herb is default.
元数据配置
如果按照以上步骤实现自定义 Starter,在测试工程的 application.properties 中配置属性 demo.springboot.starter.herb 时,并不会有提示信息。这是因为你并没有配置元数据。在 Spring Boot 官方文档中提到,可以新建 META-INF/additional-spring-configuration-metadata.json文件,进行元数据配置。
然后重新上传自定义的 Starter,刷新测试工程的 Gradle 依赖,就可以看到提示信息了: