前一篇(点这里)文章中介绍了简单的starter的基本组成,本篇文章就介绍一下带约束的starter如何搞。
在开搞之前,修改一下我们的pom文件,修改完成后关键部分如下,新增了一个依赖包,因为后面的@ConfigurationProperties需要:
<dependencies>
<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>
</dependencies>
新增/修改几个相关类
新增属性包装类,用于从application.properties(yaml)中读取配置:
@ConfigurationProperties("log.collector")
public class LogCollectorProperties {
private String prefix;
// 省略getter/setter方法
}
修改关键的AutoConfig类:
@Configuration
@EnableConfigurationProperties(LogCollectorProperties.class)
public class LogCollectorAutoConfig {
@Autowired
private LogCollectorProperties logCollectorProperties;
@Bean(name = "logCollector")
@ConditionalOnMissingBean
// @ConditionalOnProperty(prefix = "log.collector",value = "enabled",havingValue = "true")
@ConditionalOnProperty(prefix = "log.collector", value = "prefix")
public LogCollector logCollector() {
return new LogCollector(logCollectorProperties.getPrefix());
}
}
逻辑实现的类也需要调整:
public class LogCollector {
private String prefix;
public LogCollector(String prefix) {
this.prefix = prefix;
}
public void info(String info) {
System.out.println(prefix.concat(info));
}
}
解释下用到的几个和Starter相关的注解:
@ConditionalOnClass,当classpath下发现该类的情况下进行自动配置。
@ConditionalOnMissingBean,当Spring Context中不存在该Bean时。
@ConditionalOnProperty(prefix = “log.collector”,value = “enabled”,havingValue = “true”),当配置文件中log.collector.enabled=true时。
当我们的AutoConfig需要依赖其他AutoConfig时,还有个@AutoConfigureAfter可用,比如:@AutoConfigureAfter(DataSourceAutoConfiguration.class)。需要在DataSourceAutoConfiguration自动化配置之后进行配置。
当我们其他业务模块使用这个starter的时候,在使用spring-boot的debug模式启动后,我们会在启动日志中的CONDITIONS EVALUATION REPORT中的Positive matches或Negative matches中看到LogCollectorAutoConfig是否被成功匹配。
到这里,一个相对简单的Starter已经完成了。
补充一
spring-boot项目中的EnableAutoConfigurationImportSelector会自动去每个jar的相应文件下查看spring.factories文件内容,并将其中的类加载出来在auto-configuration过程中进行配置。而EnableAutoConfigurationImportSelector在@EnableAutoConfiguration注解中被import。而最重要@SpringBootApplication注解,其本身是个复合Annotation,由三个Annotation构成,其中一个就是@EnableAutoConfiguration,另外两个是@Configuration和@ComponentScan。
本文深入介绍了如何创建一个带有条件约束的SpringBoot Starter。通过修改POM文件,新增和调整相关类,如属性包装类、AutoConfig类和逻辑实现类。文章详细解释了@ConditionalOnClass、@ConditionalOnMissingBean和@ConditionalOnProperty等注解的用法,这些注解用于控制Starter在特定条件下自动配置。在使用Starter的项目中,可以在启动日志中观察到配置是否生效。

1万+

被折叠的 条评论
为什么被折叠?



