SpringBoot之自定义starter

1,813 阅读3分钟

使用过SpringBoot的同学都知道,SpringBoot通过默认配置的方式让我们大大简化了项目初始的搭建过程和开发过程,我们只需要在maven中引入starter依赖,SpringBoot就能自动扫描到要加载的信息并启动相应的默认配置。starter让我们摆脱了各种依赖库的处理,简化配置。

自定义starter有什么用

既然starter有这么大的优点,那我们可不可以在日常开发工作中用到呢,答案是当然可以!我们经常会有一些独立于业务之外的配置模块,使用的时候会将其放到一个特定的包下,或者是打成一个jar包集成进去,然后如果另一个工程需要复用这块功能的时候,需要将代码硬拷贝到另一个工程,重新集成一遍。如果我们将这些可独立于业务代码之外的功配置模块封装成一个个的starter,复用的时候只需要将其在pom中引用依赖即可。

如何自定义starter

优点已经介绍够了,那我怎么开始自定义一个boot starter呢,接下来就跟我一起做一个吧。

首先要注意一下命名规范:

SpringBoot官方包的命名:

前缀:spring-boot-starter-(模块名)

eg:spring-boot-starter-web、spring-boot-starter-aop

官方建议自定义starter命名:

后缀:(模块名)-spring-boot-starter

eg:mybatis-spring-boot-starter

这样以便官方的starter和自定义starter区分开。

引入pom

新建一个maven项目,我这里是自定义的一个oss文件上传的starter,所以命名为:oss-spring-boot-starter。然后添加pom依赖:

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

这样starter包可以自动从配置文件获取项目本身的配置参数,从而更灵活的适应项目个性化。

定义配置类

starter中的一些配置化的东西单独写一个配置类,在使用端中引入这个starter的时候,可以动态的在yaml文件中配置:

@ConfigurationProperties(prefix = "oss")
@Data
@NoArgsConstructor
public class OssProperties {
    private String accessKey;
    private String secretKey;
    private String bucketName;
    private String prefixDomain;
    private String temporaryFolder;
    private String rootPath;
}

定义service

实现文件的上传、删除、移动等功能

public class OssFileService {
    private OssProperties ossProperties;
    public MinIoFileServiceImpl(OssProperties ossProperties) {
        this.ossProperties = ossProperties;
    }
    public void uploadFile(File file){
    
    }
    public void deleteFile(String fileName){
    
    }
    public void moveOrRenameFile(String oldName,String newName, String toBucket){
    
    }
}

定义程序入口

@EnableConfigurationProperties(OssProperties.class)
@ConditionalOnProperty(prefix = "oss", name = "type", havingValue = "minio")
@Configuration
public class MinIoConfig {
    @Autowired
    private OssProperties ossProperties;

    @Bean
    public OssFileService fileService(){
        return new MinIoFileServiceImpl(ossProperties);
    }
}

这里使用了@ConditionalOnProperty注解,在满足type=minio的条件下,这里的bean就会自动装配,在使用端直接使用@Autowired的方式注入OssFileService就可以直接使用了。

配置扫包

在resources目录下建META-INF目录,创建spinrg.factories文件,文件内容:

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.lingxiao.oss.MinIoConfig

使用

在使用端引入pom:

<dependency>
		<groupId>com.lingxiao</groupId>
		<artifactId>oss-spring-boot-starter</artifactId>
		<version>0.0.1-SNAPSHOT</version>
</dependency>

配置文件application.yml:

oss:
  type: minio
  accessKey: admin 
  secretKey: 12345678
  bucketName: file  
  prefixDomain: http://oss.lingxiao.com
  rootPath: 

然后在使用@Autowired注入就能使用了:

@Autowired
private OssFileService ossFileService;

怎么样,是不是很简单呢,小朋友,你学会了吗?