Spring boot starter的制作
1、新建SpringBoot工程
pom.xml内容如下
<!-- spring-boot遵循“约定优于配置”这一原则,而spring-boot-autoconfigure模块正是完美的实现这个原则 -->
<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>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.7.RELEASE</version>
<configuration>
<mainClass>com.xiaoxiong.startspringboot.StartSpringbootApplication</mainClass>
<--> 这个配置很是重要不然会导致应用自定义的start中的类不生效 </-->
<skip>true</skip>
</configuration>
<executions>
<execution>
<id>repackage</id>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
2、定义一个bean映射配置信息
@ConfigurationProperties(prefix = "starter")
public class StarterProperties {
private String starterName;
private boolean autoStarter;
public String getStarterName() {
return starterName;
}
public void setStarterName(String starterName) {
this.starterName = starterName;
}
public boolean isAutoStarter() {
return autoStarter;
}
public void setAutoStarter(boolean autoStarter) {
this.autoStarter = autoStarter;
}
}
3、定义配置类
/**
* @author xiaoxiong
* @version 1.0
* @since 2022/3/12 20:06
*
* @Retention(RetentionPolicy.RUNTIME)
* @Target({ ElementType.TYPE, ElementType.METHOD })
* @Documented
* @Conditional(OnPropertyCondition.class)
* public @interface ConditionalOnProperty {
*
* // 数组,获取对应property名称的值,与name不可同时使用
* String[] value() default {};
*
* // 配置属性名称的前缀,比如spring.http.encoding
* String prefix() default "";
*
* // 数组,配置属性完整名称或部分名称
* // 可与prefix组合使用,组成完整的配置属性名称,与value不可同时使用
* String[] name() default {};
*
* // 可与name组合使用,比较获取到的属性值与havingValue给定的值是否相同,相同才加载配置
* String havingValue() default "";
*
* // 缺少该配置属性时是否可以加载。如果为true,没有该配置属性时也会正常加载;反之则不会生效
* boolean matchIfMissing() default false;
*
* }
*/
@Configuration
//该注解用来开启上面一步 @ConfigurationProperties 注解配置bean的支持
@EnableConfigurationProperties(StarterProperties.class)
// @ConditionalOnProperty用来控制@Configuration是否生效,
// 简单来说也就是我们可以通过在yml或properties配置文件中控制 @Configuration 注解的配置类是否生效。
@ConditionalOnProperty(prefix = "starter", name = "isopen", havingValue = "true")
public class StarterConfig {
@Autowired
private StarterProperties properties;
@Bean
public StarterService starterService() {
return new StarterService(properties);
}
}
4、定义简单Service用来测试
public class StarterService {
private StarterProperties properties;
public StarterService(StarterProperties properties) {
this.properties = properties;
}
public String sayHello() {
return properties.getStarterName() + "\t" + properties.isAutoStarter();
}
}
5、创建spring.factories文件(这一步很重要)
在resources文件夹中创建META-INF文件夹,再将spring.factories放到META-INF文件夹下面,spring.factories文件内容如下:(这一步是springboot SPI机制)
org.springframework.boot.autoconfigure.EnableAutoConfiguration=com.xiaoxiong.startspringboot.config.StarterConfig
6、打包到本地仓库
mvn clean install
7、新建项目测试
引入刚才的spring boot start
<dependency>
<groupId>com.xiaoxiong</groupId>
<artifactId>start-springboot</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在配置文件中配置刚才定义的属性
starter.isopen=true
starter.auto-starter=true
starter.starter-name=xiaoxiong
写controller测试
@GetMapping("starter")
public String test_starter() {
return starterService.sayHello();
}
结果: