说明:SpringBoot项目之所以开发起来很方便,是因为SpringBoot项目在启动时自动为我们装配了很多Bean对象(参考:http://t.csdn.cn/MddMO),这取决于我们是否在pom.xml文件添加对应的依赖,称为起步依赖。
我们自己也可以自定义实现一个起步依赖,让后面创建的模块,只要引用了该模块,就可以自动调用该依赖所属的Bean对象,实现对应的功能。这里我以阿里云OSS上传文件功能为例,自定义一个该功能的依赖(阿里云OSS使用参考:http://t.csdn.cn/WCDZt)。
【第一步】新建自动配置模块
创建一个oss-essay-spring-boot-autoconfigure模块,该模板内仅放完成阿里云OSS上传的所有依赖,不编写一行代码
<!--表明该项目为SpringBoot项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.12</version>
<relativePath/>
</parent>
<dependencies>
<!--springboot web项目依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!--阿里云OSS依赖-->
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.15.1</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.1</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
<!-- no more than 2.3.3-->
<dependency>
<groupId>org.glassfish.jaxb</groupId>
<artifactId>jaxb-runtime</artifactId>
<version>2.3.3</version>
</dependency>
<!--一键生成domain set、get、toString依赖-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
<!--消除报错依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
</dependencies>
【第二步】创建起步依赖模块
创建一个oss-essay-spring-boot-start模块,该模块引用自动配置(oss-spring-boot-autoconfigure)依赖,利用该模块内的依赖实现阿里云OSS上传的任务代码
<!--引入自动装配模块-->
<dependencies>
<dependency>
<groupId>com.essay</groupId>
<artifactId>oss-essay-spring-boot-autoconfigure</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
实现OSS上传,需要以下三个类:
OssProperties类
该类里面存放实现OSS上需要的传配置属性(四个),并添加以下三个注解
@Data:给属性增加setter()、getter()、toString()方法
@Component:将该类加入到IOC容器中
@ConfigurationProperties(prefix = “aliyun.oss”):指定用户使用时,该配置来自于用户配置文件哪个配置
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
/**
* OSS配置类
*/
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class OssProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
OssTemplate类
该类为具体实现OSS上传的类,首先为了实现OSS上传,需要OssProperties类中的信息,
因此,该类中除了OSS上传的功能代码,还需要定义一个OssProperties类对象,该类对象的实例来自用户的配置,所以需要设置一个setOssProperties的方法
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.UUID;
/**
* OSS功能实现类
*/
public class OssTemplate {
private OssProperties ossProperties;
public void setOssProperties(OssProperties ossProperties) {
this.ossProperties=ossProperties;
}
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取上传的文件的输入流
InputStream inputStream = file.getInputStream();
// 避免文件覆盖
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID() + originalFilename.substring(originalFilename.lastIndexOf("."));
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String date = sdf.format(new Date());
// 上传到OSS Bucket下面的image文件夹内
fileName = "image"+ "/" + date + "/" + fileName;
// 上传文件到 OSS
OSS ossClient = new OSSClientBuilder().build(ossProperties.getEndpoint(), ossProperties.getAccessKeyId(), ossProperties.getAccessKeySecret());
ossClient.putObject(ossProperties.getBucketName(), fileName, inputStream);
// 文件访问路径
String url = ossProperties.getEndpoint().split("//")[0] + "//" + ossProperties.getBucketName() + "." + ossProperties.getEndpoint().split("//")[1] + "/" + fileName;
// 关闭ossClient
ossClient.shutdown();
// 把上传到oss的路径返回
System.out.println(url);
return url;
}
}
OssAutoConfiguration类
该类的任务是自动装配Bean(OssTemplate),所以需要加@Configuration注解,
因为OssTemplate类的使用,需要用户OSS的配置(OssProperties类对象),所以还需要加一个@EnableConfigurationProperties()注解,括号内填OssProperties.class
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
/**
* OSS自动配置类
*/
@Configuration
@EnableConfigurationProperties(OssProperties.class)
public class OssAutoConfiguration {
/**
* 手动放入OssTemplate模板工具类
* @param ossProperties
* @return
*/
@Bean
public OssTemplate ossTemplate(OssProperties ossProperties){
// 创建Template对象
OssTemplate ossTemplate = new OssTemplate();
// 设置该Template对象的OSS配置
ossTemplate.setOssProperties(ossProperties);
return ossTemplate;
}
}
最后
OssAutoConfiguration类作为自动装配类,它的全类名要存在该模块的本地资源中(META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports)
可以从Spring的依赖中,复制一份过来,把不需要的文件删掉
(复制,删除不需要的文件)
(org.springframework.boot.autoconfigure.AutoConfiguration.imports)
至此,自定义start依赖的任务就完成了。
【第三步】创建Demo模块测试
新建Demo
在新建的模块中,直接引入oss-spring-boot-start模块。因为OSS功能是在SpringBoot项目环境中使用的,所以需要parent标签中加入SpringBoot引用,使该项目成为一个SpringBoot项目。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.essay</groupId>
<artifactId>oss-essay-spring-boot-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<properties>
<maven.compiler.source>11</maven.compiler.source>
<maven.compiler.target>11</maven.compiler.target>
</properties>
<!--SpringBoot项目-->
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.10</version>
<relativePath/>
</parent>
<!--引入我们自定义的OSS起步依赖-->
<dependencies>
<dependency>
<groupId>com.essay</groupId>
<artifactId>oss-essay-spring-boot-start</artifactId>
<version>1.0-SNAPSHOT</version>
</dependency>
</dependencies>
</project>
import aliyun.oss.OssTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
import java.io.IOException;
@RestController
public class UploadController {
/**
* 因为自定义了起步依赖,所以可以直接自动装配
*/
@Autowired
private OssTemplate ossTemplate;
@PostMapping("/upload")
public String upload(MultipartFile file) throws IOException {
String url = ossTemplate.upload(file);
return url;
}
}
创建配置文件
再创建一个application.yml文件,里面关于OSS的配置信息要与@ConfigurationProperties(prefix = “aliyun.oss”)中的一样,才能读取到,之后正常测试即可。
使用postman测试
我这里以桌面上的这张图片为例
测试结果:
总结
通过自定义起步依赖,可以自己感受一下SpringBoot在底层帮助我们做的自动装配流程,同时也加深了对SpringBoot底层的理解。