SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

这篇具有很好参考价值的文章主要介绍了SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本文同步更新于鼠鼠之家

starter定义

starter就是springboot中的起步依赖,虽然springboot已经提供了很多的起步依赖,但是在实际项目开发中可能会用到和第三方的技术,不是所有第三方在springboot中都有收录。

比如之前文章中有用到过的阿里云OSS,阿里云并没有提供起步依赖,导致每次使用时都要自己写一些类。

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

springboot官方提供的起步以来是spring-boot在前,其他提供的通常都是技术名在前。

下面mybatis的起步依赖中没有java代码,只是整合了mybatis开发需要的依赖的坐标SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter)) 其中包含了一个依赖mybatis-spring-boot-autoconfigure,这个自动配置类里面声明了一堆Bean对象。

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

 里面可以看见一些常用的类比如SqlSessionFactory SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

那么这些配置类配置好之后是如何被SpringBoot项目加载到IOC容器并完成自动配置的呢?

前面有说到过,SpringBoot在启动时会加载依赖中的两份文件,如果是老版本的就加载spring.factories,如果是新版本的就加载autoconfigure.import这个文件。

因此该自动配置类配置好之后,就可以在spring.factories或者是autoconfigure.import文件中配置这个自动配置类。

最终会儿被加载到spring的IOC容器当中.

因此自定义一个起步依赖starter的时候按照规范需要定义两个模块,一个是starter模块,其唯一的作用就是进行依赖管理。

另一个autoconifure的包就是完成自动配置的操作。 

最终在项目中只会导入starter模块,因为starter已经导入了autoconfigure模块了。        

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

上面就是简单介绍了自定义starter的场景以及自定义starter涉及的各个模块和各个模块涉及的功能.

自定义starter案例

需求说明

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

在不封装的时候,每次使用都要自己手动写一些OSS的工具类并添加到IOC容器当中去。

根据阿里云官方提供的示例SDK文件改造成如下一个工具类,并在yml配置文件当中配置需要的参数,然后还要一个实体类加载配置文件中的配置项。

最后才可以在工具类中获取到需要的参数,然后交给springIOC容器管理,然后在项目用到时就直接注入。

这个过程十分的繁琐

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter)) SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

具体封装看这里一下两篇文章

云服务——阿里云OSS的入门使用_北岭山脚鼠鼠的博客-CSDN博客SpringBoot——SB整合mybatis案例(残缺版本)第三集_北岭山脚鼠鼠的博客-CSDN博客

上面的这个过程是十分繁琐且重复的一个过程,因此可以将其封装成一个依赖项,可以通过坐标引入后直接使用。

步骤分析

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

具体实现 

创建好两个需要的模块

选择新建新模块

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

首先新建一个starter模块

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter)) 规整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模块的项目文件删除的只剩下一个pom.xml和一个iml文件。

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

然后再新建一个autoconfigure的模块,按照上面的流程再走一次

然后修改 autoconfigure模块的pom.xml如下,将项目文件删成如下的结构,只比上面多一个src

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

<?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是作为其他项目文件的依赖的,所以application这个启动类不需要,配置文件也不需要,测试单元也不需要。删除如下图所示的三个文件 

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

模块创建工作结束 (上面就准备好了一个依赖所需要的两个基本模块了)

然后需要在starter模块引入autoconfigure模块,这是前面提到过的规范。

直接导入autoconfigure的坐标。

        <dependency>
            <groupId>com.aliyun.oss</groupId>
            <artifactId>aliyun-oss-spring-boot-autoconfigure</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        </dependency>

在autoconfigure中完成自动配置操作

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

 根据目标需求,需要在autoconfigure准备一个AliyunOSSUtils工具类。

1.引入依赖

要在项目中使用阿里云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.准备工具类和实体类 

在之前的项目开发中使用阿里云OSS时需要用到的类有一个工具类和一个实体类

实体类里面封装的是阿里云的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;
}

还有一个工具类

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;

    /**
     * 实现上传图片到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("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        // 关闭ossClient
        ossClient.shutdown();
        return url;// 把上传到oss的路径返回
    }

}

将上面两个文件放到autoconfigure项目中时会有一个报错,需要引入两个新的依赖

一个是web开发的以来,一个是@Data注解的依赖,又或者可以不引入lombok的以来,然后手动提供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>

然后两个类都没有报错了,但是现在两个类上的component注解已经没有用了,因为将来这个依赖引入项目时包扫描也不会扫这个依赖模块的包,所以两个类上的@component注解可以删除了。

注意:这里删除会导致aliOSSProperties实体类出现红色报错,但是这里可以先不用管,下面会解决。

然后还有工具类里面的@Autowired也可以删除了,因为已经不是IOC容器里面的Bean了,不能进行autowired注入了。

但是根据需求提到的直接注入工具类直接使用,所以还是要将其交给spring容器进行管理。

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

因此现在需要准备一个自动配置类来声明阿里云OSS的这个工具类的Bean,然后将配置类交给spring容器管理。

3.新建自动配置类

这个配置类可以获取到AliOSSUtils这个工具类的,然后直接使用upload方法进行文件上传操作,但是在那之前upload方法里面是还需要一个aliOSSProperties成员变量的,所以在工具类当中还要准备它的get和set方法.

然后在获取到AliOSSUtils时还需要为里面的aliOSSProperties赋值。

然后aliOSSProperties当中需要的属性值都是从配置文件当中获取得到的,然后封装成一个aliOSSProperties实体类。

@ConfigurationProperties(prefix = "aliyun.oss")

这里需要解决上面这块的报错问题,可以直接在自动配置类上加上如下的注解,将AliOSSProperties变成一个IOC容器中Bean对象就不会报错了。

@EnableConfigurationProperties(AliOSSProperties.class)

再然后在配置类,声明一个第三方Bean时需要注入某一个对象可以直接在方法形参中指定,最终会自动装配进来。


@Configuration
@EnableConfigurationProperties(AliOSSProperties.class)
public class AliOSSAutoConfiguration {
    @Bean
    public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties){
        AliOSSUtils aliOSSUtils= new AliOSSUtils();
        aliOSSUtils.setAliOSSProperties(aliOSSProperties);
        return aliOSSUtils;
    }
}

到这里,自动配置类已经配置好了,另外两个类别忘记删除@Component和@Autowried注解并且加上aliOSSProperties的get还有set方法就可以了。

4.最后一步

要想自动配置类被加载到项目中就需要在一个固定的配置文件中来配置。

就是META-INF/spring/xxx.imports中,所以现在autoconfigure模块的resources目录下新建一个对应的文件夹和需要的一个名字很长的文件。

注意名字不能打错。

在这个文件中的都是自动配置类的全类名,所以要把上面写好的一个自动配置类放到里面去。 

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

com.aliyun.oss.AliOSSAutoConfiguration

到此,这个starter已经定义完了,在starter中进行依赖管理,在configure中进行自动配置。

在测试工程中对封装好的starter进行测试

在提供的资源中有一个测试工程。

在这个测试工程的Controller层中有一个uploadController如下,需要将接收到文件上传到阿里云OSS。

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

然后这里可以直接引入上面的起步依赖,然后就可以直接上传文件到OSS了。

在测试工程的pom文件当中,引入如下依赖。

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

 然后就需要在配置文件当中需要一些阿里云账号的参数,需要的配置信息有如下的四项,都需要在测试工程的配置文件上准备好。

这里根据个人的实际账号资料进行配置。 

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter)) SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

最后在controller当中实现如下,将已经上传的文件交给阿里云OSS进行保存

@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;
    }
}

项目运行测试 (使用postman测试)

上面那里将依赖导入别的项目时可能会有出现Cannot reconnect的傻狗报错,这时候只需要重启IDEA即可。

成功上传文件到阿里云并且获得了文件url。 

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))

完成了这个依赖封装,我就可以自己搞一个网页,然后自己上传自己的东西,然后自己下载自己的东西了。 真不错。

小结

SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))文章来源地址https://www.toymoban.com/news/detail-471904.html

 SpringBoot原理章节完结撒花!

到了这里,关于SpringBoot——原理(自动配置_案例(自定义阿里云文件上传starter))的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SpringBoot案例-配置文件-yml配置文件

    SpringBoot提供了多种属性配置方式 application.properties application.yml application.yaml 常见配置文件格式对比 XML(臃肿) properties(层级结构不够清晰) yml/yaml( 简洁,以数据为中心, 推荐使用 ) 基本语法 大小写敏感 数值前必须有空格 ,作为分隔符 使用缩进表示层级关系,缩进时

    2024年02月11日
    浏览(42)
  • Springboot启动原理和自动配置原理

    关于 springboot 启动流程和配置原理 很久就写了,不过没有详细补充 ,现在补充 —— 2023-08-05 BootstrapRegistryInitializer 是一个函数是接口 org.springframework.boot.BootstrapRegistry 接口 getSpringFactoriesInstances 加载工厂中组件实现方式 org.springframework.core.io.support.SpringFactoriesLoader#loadSpringFacto

    2023年04月25日
    浏览(48)
  • SpringBoot原理-自动配置-原理分析-源码跟踪

    SpringBootApplication 该注解标识在SpringBoot项目的启动类上,是SpringBoot中 最为重要 的注解,该注解由三个部分组成。 @SpringBootConfiguration:该注解与@Configuration注解作用一样,用来声明当前类为一个配置类 @ComponentScan:组件扫描,默认扫描当前启动类所在包及其子包 @EnableAutoConf

    2024年02月09日
    浏览(43)
  • SpringBoot 自动配置原理

    springboot是基于spring的新型的轻量级框架,最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘面纱

    2024年01月20日
    浏览(41)
  • SpringBoot自动配置原理

    springboot是基于spring的新型的轻量级框架,最厉害的地方当属**自动配置。**那我们就可以根据启动流程和相关原理来看看,如何实现传奇的自动配置 从上面代码可以看出,Annotation定义(@SpringBootApplication)和类定义(SpringApplication.run)最为耀眼,所以要揭开SpringBoot的神秘面纱

    2024年01月21日
    浏览(42)
  • SpringBoot自动配置的原理

    以WebMvcAutoConfiguration自动配置的原理为例,SpringBoot内部对大量的第三方库或Spring内部库进行了默认配置,这些配置是否生效,取决于我们是否引入了对应库所需的依赖,如果有那么默认配置就会生效。如果引入springboot-starter-web那么对应的web配置就会自动配置。那么是如何自动

    2024年02月09日
    浏览(34)
  • SpringBoot3自动配置原理

    遵循约定大约配置的原则,在boot程序启动后,起步依赖中的一些bean对象会自动注入到ioc容器 看一下我们前面写的代码有没有达到自动配置的效果呢? 没有自动,我们写了配置类,写了@Import注解,所以并没有达到自动配置的效果。那怎么办呢?接下来我们通过翻看源码的方

    2024年01月22日
    浏览(37)
  • springboot 原理分析之自动配置

             Condition 是在 Spring 4.0 增加的条件判断功能,通过这个可以功能可以实现选择性的创建 Bean 操作。比如说,只有满足某一个条件才能创建这个 Bean ,否则就不创建。         SpringBoot 是如何知道要创建哪个 Bean 的?比如 SpringBoot 是如何知道要创建  RedisTemplate 

    2024年01月19日
    浏览(37)
  • SpringBoot自动配置原理简单分析

    说明:在SpringBoot项目中,我们添加了许许多多的注解,这些注解提高了开发效率。这是因为SpringBoot在项目启动时,帮我们自动装配了大量的Bean对象,可以通过分析源码查看自动装配的大致原理。 进入到启动类中的@SpringBootApplication注解中,该注解里面有七个注解,上面四个

    2024年02月09日
    浏览(43)
  • Spring(8) Springboot自动配置原理

    Springboot 的自动配置原理,是Springboot中最高频的一道面试题,也是Springboot框架最核心的思想。 首先我们看一张我总结的自动配置原理概览图: 下面,我们就根据这张图详细描述一下具体过程: 首先,我们来看一段代码: 上面就是一段普通的 Springboot 引导类代码,这里有一

    2024年02月12日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包