springboot 自定义starter:带条件启动器

本文深入介绍了如何创建一个带有条件约束的SpringBoot Starter。通过修改POM文件,新增和调整相关类,如属性包装类、AutoConfig类和逻辑实现类。文章详细解释了@ConditionalOnClass、@ConditionalOnMissingBean和@ConditionalOnProperty等注解的用法,这些注解用于控制Starter在特定条件下自动配置。在使用Starter的项目中,可以在启动日志中观察到配置是否生效。

前一篇(点这里)文章中介绍了简单的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 matchesNegative matches中看到LogCollectorAutoConfig是否被成功匹配。

到这里,一个相对简单的Starter已经完成了。

补充一

spring-boot项目中的EnableAutoConfigurationImportSelector会自动去每个jar的相应文件下查看spring.factories文件内容,并将其中的类加载出来在auto-configuration过程中进行配置。而EnableAutoConfigurationImportSelector@EnableAutoConfiguration注解中被import。而最重要@SpringBootApplication注解,其本身是个复合Annotation,由三个Annotation构成,其中一个就是@EnableAutoConfiguration,另外两个是@Configuration@ComponentScan

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值