# boot-starter-demo **Repository Path**: liukunc9/boot-starter-demo ## Basic Information - **Project Name**: boot-starter-demo - **Description**: 如何封装一个自己的Spring Boot Starter包 - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2020-12-02 - **Last Updated**: 2020-12-17 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Spring Boot Starter的演示 ## 模块说明 - demo-boot-starter: 自动配置demo - demo-server: 测试自动配置的演示程序 ## 核心点说明 只需要在 starter 包的 resources/META-INF/ 目录下,新建 spring.factories 文件, 并在文件中写入需要自动加载进容器的配置类即可,这是我的配置 ```yaml org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ org.alanlau.DemoAutoConfiguration ``` 然后当我们的 starter 包被引用的时候,这个配置类会被容器自动加载进去, org.alanlau.DemoAutoConfiguration 的代码如下: ```java @Configuration @EnableConfigurationProperties({DemoProperties.class}) @ConditionalOnProperty(prefix = "org.alanlau", value = "enabled", havingValue = "true", matchIfMissing = true) @Import({TestConfiguration.class}) public class DemoAutoConfiguration { } ``` > 这里说一下 @Import 注解吧,如果 @Import 引入的是一个用 @Configuration 注解的配置类, > 则说明,该配置类的加载要优先于当前类,如果引入的是一个普通类,则相当于是在该类上加上了 > @Configuration 的作用,用这种方式保证了一定是我们的自动配置类引入的,而不是通过 > @ComponentScan 配置的扫描包扫到了该类而使得该配置类被引入。 ## 填坑说明 我本来是想通过 org.alanlau.enabled 这个属性的值来控制该配置类是否生效,然后我在属性类 中给了默认的值,DemoProperties的代码如下: ```java @ConfigurationProperties(prefix = "org.alanlau") public class DemoProperties { /** * 是否启用 */ private boolean enabled = true; public boolean isEnabled() { return enabled; } public void setEnabled(boolean enabled) { this.enabled = enabled; } } ``` 但是没想到,@ConditionalOnProperty 并不会去掉用 isEnabled() 来判断,而是直接去拿yaml 中的属性来判断,这就导致了拿到的值是 null ,所以为了解决这个问题,我在 @ConditionalOnProperty 中添加了 **matchIfMissing = true** 来保证了默认值的实现, 同时 DemoProperties 中的 enabled = true 保证了在 yml 中的默认提示是 true,和我们 设置的条件一致,完美解决! ## 执行效果 运行 demo-server 模块,除非在 application.yml 中配置 org.alanlau.enabled = false, 否则会在控制台打印如下内容: ![avatar](./images/1.png)