本文同步更新于鼠鼠之家
starter定義
starter就是springboot中的起步依賴,雖然springboot已經(jīng)提供了很多的起步依賴,但是在實(shí)際項(xiàng)目開發(fā)中可能會用到和第三方的技術(shù),不是所有第三方在springboot中都有收錄。
比如之前文章中有用到過的阿里云OSS,阿里云并沒有提供起步依賴,導(dǎo)致每次使用時(shí)都要自己寫一些類。
springboot官方提供的起步以來是spring-boot在前,其他提供的通常都是技術(shù)名在前。
下面mybatis的起步依賴中沒有java代碼,只是整合了mybatis開發(fā)需要的依賴的坐標(biāo)?其中包含了一個(gè)依賴mybatis-spring-boot-autoconfigure,這個(gè)自動(dòng)配置類里面聲明了一堆Bean對象。
?里面可以看見一些常用的類比如SqlSessionFactory?
那么這些配置類配置好之后是如何被SpringBoot項(xiàng)目加載到IOC容器并完成自動(dòng)配置的呢?
前面有說到過,SpringBoot在啟動(dòng)時(shí)會加載依賴中的兩份文件,如果是老版本的就加載spring.factories,如果是新版本的就加載autoconfigure.import這個(gè)文件。
因此該自動(dòng)配置類配置好之后,就可以在spring.factories或者是autoconfigure.import文件中配置這個(gè)自動(dòng)配置類。
最終會兒被加載到spring的IOC容器當(dāng)中.
因此自定義一個(gè)起步依賴starter的時(shí)候按照規(guī)范需要定義兩個(gè)模塊,一個(gè)是starter模塊,其唯一的作用就是進(jìn)行依賴管理。
另一個(gè)autoconifure的包就是完成自動(dòng)配置的操作。?
最終在項(xiàng)目中只會導(dǎo)入starter模塊,因?yàn)閟tarter已經(jīng)導(dǎo)入了autoconfigure模塊了。????????
上面就是簡單介紹了自定義starter的場景以及自定義starter涉及的各個(gè)模塊和各個(gè)模塊涉及的功能.
自定義starter案例
需求說明
在不封裝的時(shí)候,每次使用都要自己手動(dòng)寫一些OSS的工具類并添加到IOC容器當(dāng)中去。
根據(jù)阿里云官方提供的示例SDK文件改造成如下一個(gè)工具類,并在yml配置文件當(dāng)中配置需要的參數(shù),然后還要一個(gè)實(shí)體類加載配置文件中的配置項(xiàng)。
最后才可以在工具類中獲取到需要的參數(shù),然后交給springIOC容器管理,然后在項(xiàng)目用到時(shí)就直接注入。
這個(gè)過程十分的繁瑣
?
具體封裝看這里一下兩篇文章
云服務(wù)——阿里云OSS的入門使用_北嶺山腳鼠鼠的博客-CSDN博客SpringBoot——SB整合mybatis案例(殘缺版本)第三集_北嶺山腳鼠鼠的博客-CSDN博客
上面的這個(gè)過程是十分繁瑣且重復(fù)的一個(gè)過程,因此可以將其封裝成一個(gè)依賴項(xiàng),可以通過坐標(biāo)引入后直接使用。
步驟分析
具體實(shí)現(xiàn)?
創(chuàng)建好兩個(gè)需要的模塊
選擇新建新模塊
首先新建一個(gè)starter模塊
?規(guī)整starter模塊的pom.xml文件如下
先改版本為2.7.5,再刪除多余的依賴。
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
然后starter模塊的項(xiàng)目文件刪除的只剩下一個(gè)pom.xml和一個(gè)iml文件。
然后再新建一個(gè)autoconfigure的模塊,按照上面的流程再走一次
然后修改?autoconfigure模塊的pom.xml如下,將項(xiàng)目文件刪成如下的結(jié)構(gòu),只比上面多一個(gè)src
<?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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.7.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
<properties>
<java.version>11</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
</dependencies>
</project>
將來autoconfigure是作為其他項(xiàng)目文件的依賴的,所以application這個(gè)啟動(dòng)類不需要,配置文件也不需要,測試單元也不需要。刪除如下圖所示的三個(gè)文件?
模塊創(chuàng)建工作結(jié)束?(上面就準(zhǔn)備好了一個(gè)依賴所需要的兩個(gè)基本模塊了)
然后需要在starter模塊引入autoconfigure模塊,這是前面提到過的規(guī)范。
直接導(dǎo)入autoconfigure的坐標(biāo)。
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
在autoconfigure中完成自動(dòng)配置操作
?根據(jù)目標(biāo)需求,需要在autoconfigure準(zhǔn)備一個(gè)AliyunOSSUtils工具類。
1.引入依賴
要在項(xiàng)目中使用阿里云OSS需要引入阿里云OSS的依賴,引入如下依賴在autoconfigure中
<!--阿里云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>
2.準(zhǔn)備工具類和實(shí)體類?
在之前的項(xiàng)目開發(fā)中使用阿里云OSS時(shí)需要用到的類有一個(gè)工具類和一個(gè)實(shí)體類
實(shí)體類里面封裝的是阿里云的key和id還有資源桶的名字
package com.example.utils;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Data
@Component
@ConfigurationProperties(prefix = "aliyun.oss")
public class AliOSSProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
還有一個(gè)工具類
package com.example.utils;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;
import java.io.*;
import java.util.UUID;
/**
* 阿里云 OSS 工具類
*/
@Component
public class AliOSSUtils {
// @Value("${aliyun.oss.endpoint}")
// private String endpoint ;
// @Value("${aliyun.oss.accessKeyId}")
// private String accessKeyId ;
// @Value("${aliyun.oss.accessKeySecret}")
// private String accessKeySecret ;
// @Value("${aliyun.oss.bucketName}")
// private String bucketName ;
/* @Value("${aliyun.oss.endpoint}")
private String endpoint;
@Value("${aliyun.oss.accessKeyId}")
private String accessKeyId;
@Value("${aliyun.oss.accessKeySecret}")
private String accessKeySecret;
@Value("${aliyun.oss.bucketName}")
private String bucketName;*/
@Autowired
private AliOSSProperties aliOSSProperties;
/**
* 實(shí)現(xiàn)上傳圖片到OSS
*/
public String upload(MultipartFile file) throws IOException {
String endpoint=aliOSSProperties.getEndpoint();
String bucketName=aliOSSProperties.getBucketName();
String accessKeyId=aliOSSProperties.getAccessKeyId();
String accessKeySecret=aliOSSProperties.getAccessKeySecret();
// 獲取上傳的文件的輸入流
InputStream inputStream = file.getInputStream();
// 避免文件覆蓋
String originalFilename = file.getOriginalFilename();
String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
//上傳文件到 OSS
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
ossClient.putObject(bucketName, fileName, inputStream);
//文件訪問路徑
String url = endpoint.split("http://")[0] + "http://" + bucketName + "." + endpoint.split("http://")[1] + "/" + fileName;
// 關(guān)閉ossClient
ossClient.shutdown();
return url;// 把上傳到oss的路徑返回
}
}
將上面兩個(gè)文件放到autoconfigure項(xiàng)目中時(shí)會有一個(gè)報(bào)錯(cuò),需要引入兩個(gè)新的依賴
一個(gè)是web開發(fā)的以來,一個(gè)是@Data注解的依賴,又或者可以不引入lombok的以來,然后手動(dòng)提供get和set方法。直接把@Data的注解去掉即可,然后alt+insert即可
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
然后兩個(gè)類都沒有報(bào)錯(cuò)了,但是現(xiàn)在兩個(gè)類上的component注解已經(jīng)沒有用了,因?yàn)閷磉@個(gè)依賴引入項(xiàng)目時(shí)包掃描也不會掃這個(gè)依賴模塊的包,所以兩個(gè)類上的@component注解可以刪除了。
注意:這里刪除會導(dǎo)致aliOSSProperties實(shí)體類出現(xiàn)紅色報(bào)錯(cuò),但是這里可以先不用管,下面會解決。
然后還有工具類里面的@Autowired也可以刪除了,因?yàn)橐呀?jīng)不是IOC容器里面的Bean了,不能進(jìn)行autowired注入了。
但是根據(jù)需求提到的直接注入工具類直接使用,所以還是要將其交給spring容器進(jìn)行管理。
因此現(xiàn)在需要準(zhǔn)備一個(gè)自動(dòng)配置類來聲明阿里云OSS的這個(gè)工具類的Bean,然后將配置類交給spring容器管理。
3.新建自動(dòng)配置類
這個(gè)配置類可以獲取到AliOSSUtils這個(gè)工具類的,然后直接使用upload方法進(jìn)行文件上傳操作,但是在那之前upload方法里面是還需要一個(gè)aliOSSProperties成員變量的,所以在工具類當(dāng)中還要準(zhǔn)備它的get和set方法.
然后在獲取到AliOSSUtils時(shí)還需要為里面的aliOSSProperties賦值。
然后aliOSSProperties當(dāng)中需要的屬性值都是從配置文件當(dāng)中獲取得到的,然后封裝成一個(gè)aliOSSProperties實(shí)體類。
@ConfigurationProperties(prefix = "aliyun.oss")
這里需要解決上面這塊的報(bào)錯(cuò)問題,可以直接在自動(dòng)配置類上加上如下的注解,將AliOSSProperties變成一個(gè)IOC容器中Bean對象就不會報(bào)錯(cuò)了。
@EnableConfigurationProperties(AliOSSProperties.class)
再然后在配置類,聲明一個(gè)第三方Bean時(shí)需要注入某一個(gè)對象可以直接在方法形參中指定,最終會自動(dòng)裝配進(jìn)來。
@Configuration
@EnableConfigurationProperties(AliOSSProperties.class)
public class AliOSSAutoConfiguration {
@Bean
public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){
AliOSSUtils aliOSSUtils= new AliOSSUtils();
aliOSSUtils.setAliOSSProperties(aliOSSProperties);
return aliOSSUtils;
}
}
到這里,自動(dòng)配置類已經(jīng)配置好了,另外兩個(gè)類別忘記刪除@Component和@Autowried注解并且加上aliOSSProperties的get還有set方法就可以了。
4.最后一步
要想自動(dòng)配置類被加載到項(xiàng)目中就需要在一個(gè)固定的配置文件中來配置。
就是META-INF/spring/xxx.imports中,所以現(xiàn)在autoconfigure模塊的resources目錄下新建一個(gè)對應(yīng)的文件夾和需要的一個(gè)名字很長的文件。
注意名字不能打錯(cuò)。
在這個(gè)文件中的都是自動(dòng)配置類的全類名,所以要把上面寫好的一個(gè)自動(dòng)配置類放到里面去。?
com.aliyun.oss.AliOSSAutoConfiguration
到此,這個(gè)starter已經(jīng)定義完了,在starter中進(jìn)行依賴管理,在configure中進(jìn)行自動(dòng)配置。
在測試工程中對封裝好的starter進(jìn)行測試
在提供的資源中有一個(gè)測試工程。
在這個(gè)測試工程的Controller層中有一個(gè)uploadController如下,需要將接收到文件上傳到阿里云OSS。
然后這里可以直接引入上面的起步依賴,然后就可以直接上傳文件到OSS了。
在測試工程的pom文件當(dāng)中,引入如下依賴。
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-oss-spring-boot-starter</artifactId>
<version>0.0.1-SNAPSHOT</version>
</dependency>
?然后就需要在配置文件當(dāng)中需要一些阿里云賬號的參數(shù),需要的配置信息有如下的四項(xiàng),都需要在測試工程的配置文件上準(zhǔn)備好。
這里根據(jù)個(gè)人的實(shí)際賬號資料進(jìn)行配置。?
?
最后在controller當(dāng)中實(shí)現(xiàn)如下,將已經(jīng)上傳的文件交給阿里云OSS進(jìn)行保存
@RestController
public class UploadController {
@Autowired
private AliOSSUtils aliOSSUtils;
@PostMapping("/upload")
public String upload(MultipartFile image) throws Exception {
//上傳文件到阿里云 OSS
String url=aliOSSUtils.upload(image);
return url;
}
}
項(xiàng)目運(yùn)行測試?(使用postman測試)
上面那里將依賴導(dǎo)入別的項(xiàng)目時(shí)可能會有出現(xiàn)Cannot reconnect的傻狗報(bào)錯(cuò),這時(shí)候只需要重啟IDEA即可。
成功上傳文件到阿里云并且獲得了文件url。?
完成了這個(gè)依賴封裝,我就可以自己搞一個(gè)網(wǎng)頁,然后自己上傳自己的東西,然后自己下載自己的東西了。?真不錯(cuò)。文章來源:http://www.zghlxwxcb.cn/news/detail-464300.html
小結(jié)
文章來源地址http://www.zghlxwxcb.cn/news/detail-464300.html
?SpringBoot原理章節(jié)完結(jié)撒花!
到了這里,關(guān)于SpringBoot——原理(自動(dòng)配置_案例(自定義阿里云文件上starter))的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!