写点什么

自定义 SpringBootStarter

用户头像
lee
关注
发布于: 2020 年 06 月 03 日
自定义 SpringBootStarter

1. Overview

spring 官方本身为开发者提供了很多的 starter, 以至于使得开发者省去了各种繁琐的配置. 只需要在 pom 中添加相应的模块即可完成添加依赖.

通过自定义starter 也可以把我们自己常用的依赖整合起来. 通过一次引入 starter 解决问题.

2. Spring Boot's 自动配置

2.1 自动配置类

当 Spring Boot 项目启动的时候, 它会首先在目录 .ETA-INF 下寻找 spring.factories文件.

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
org.springframework.boot.autoconfigure.amqp.RabbitAutoConfiguration,\\
org.springframework.boot.autoconfigure.cassandra.CassandraAutoConfiguration,\\
org.springframework.boot.autoconfigure.mongo.MongoAutoConfiguration,\\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration

文件中的这些路径表示不同配置类. 这些配置类在spring boot 运行时会去执行他们.

2.2 在application.properties 中配置自定义属性

spring boot在初始化beans时会使用到一些属性的默认值,为了覆盖默认值, 可以通过在 application.properties 中使用约定好的方式声明覆盖值.

@ConfigurationProperties("lee.service")
public class ExampleServiceProperties {
private String name;
private String gender;
//.....
}

一切从假如开始, 假如我们现在搞微服务开发, 不同服务之间会发生调度, 这时调用方和被调用方就会面临着定义相同 Model 需求, 比如: 服务 A 提供了一个接口用于返回 User 对象, 那么服务 B 调用服务 A 的时候同样也需要定义一个 User 对象. 这个问题的解决方案有很多, 这里为了了解 Starter , 所以强行使用了这么个东西.

3. 创建自定义 starter

创建自定义 starter 基本两个主要部分

  1. 自动配置类

  2. 添加 pom依赖

3.1 自动配置类

属性注入类

@ConfigurationProperties("lee.service")
public class LeeServiceProperties {
private String name;
private String gender;

bean自动配置类

@Configuration
@ConditionalOnClass(LeeService.class)
@EnableConfigurationProperties(LeeServiceProperties.class)
public class LeeAutoConfigure {
private final LeeServiceProperties properties;
@Autowired
public LeeAutoConfigure(LeeServiceProperties properties) {
this.properties = properties;
}
@Bean
@ConditionalOnMissingBean
@ConditionalOnProperty(prefix = "lee.service", value = "enabled",havingValue = "true")
LeeService leeService (){
return new LeeService(properties.getName(),properties.getGender());
}
}

spring.factories 文件定义

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\\
com.xncoding.starter.config.LeeAutoConfigure

3.2 pom 定义

主要依赖:

<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
</dependency>

note:

在pom文件中引入新创建的starter依赖,提示 Cannot resolve symbol 'packageName'

解决办法:

删除:

<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>

安装依赖: mvn:install 安装到本地

4. 测试

4.1 pom 中添加依赖

<dependency>
<groupId>com.lee</groupId>
<artifactId>springboot-starter</artifactId>
<version>1.0.0-SNAPSHOT</version>
</dependency>

4.2 使用

@Component
public class AppCommand implements CommandLineRunner {
private Logger logger = LoggerFactory.getLogger(AppCommand.class);
@Autowired
private LeeService leeService;
@Override
public void run(String... args) throws Exception {
logger.info(leeService.wrap(leeService.getClass().toString()));

配置属性

lee.service.gender=nan
lee.service.name=xiaoming
lee.service.enabled=true

4.3 输出:

xiaomingtestclass com.xncoding.starter.service.LeeServicenan

总结

大致步骤如下:

  1. 创建自动配置类

  2. 添加 spring.factories 文件, 并指向自动配置类

  3. 打包即可.



参考: https://www.baeldung.com/spring-boot-custom-starter

发布于: 2020 年 06 月 03 日阅读数: 84
用户头像

lee

关注

just 2019.06.12 加入

just do it

评论

发布
暂无评论
自定义 SpringBootStarter