• SpringBoot原理-自动配置-案例(自定义starter分析)


    目录

    starter起步依赖

    自定义starter

    结构规范

    命名规范

    官方起步依赖命名规范

    第三方起步依赖命名规范

    自定义starter案例

    分析

    步骤

    具体实现

    starter包

    autoconfigure包


    starter起步依赖

    • 起步依赖(Starter)是Spring Boot提供的一种依赖管理机制,用于简化项目的依赖配置和版本冲突问题。

      起步依赖实际上是一组相关的依赖的集合,它们被打包成一个单独的依赖,可以一次性引入到项目中。起步依赖中包含了常用的依赖和配置,可以快速地启动和配置相应的功能。

      在使用Spring Boot时,可以通过在项目的pom.xml文件中引入起步依赖来简化依赖配置。只需要引入相应的起步依赖,Spring Boot会自动管理和加载所需的依赖。

      起步依赖的命名通常遵循一定的规则,例如spring-boot-starter-web用于启动Web应用,spring-boot-starter-data-jpa用于启动使用JPA进行数据持久化的应用等。每个起步依赖都有明确的功能和用途。

      通过使用起步依赖,开发人员可以快速构建和配置Spring Boot应用,减少了手动配置和版本冲突的问题,提高了开发效率。同时,起步依赖也提供了一致性和可维护性,使得项目的依赖管理更加简单和可靠。

    自定义starter

    • 在项目开发过程中我们会使用很多第三方的技术,但是并不是所有的第三方技术都提供了与SpringBoot整合的starter起步依赖,由此我们使用起来会比较的繁琐,我们要引入对应的依赖,要在对应的配置文件中进行配置,还需要基于官方SDK(Software Development Kit)示例改造工具类才可以使用。
    • 在实际开发过程中,经常会定义一些公共组件,提供给各个团队使用。而在SpringBoot项目中,一般会将这些公共组件封装为SpringBoot的starter

    结构规范

    • 起步依赖由两部分组成,在starter包中进行依赖管理功能,在autoconfigure包中进行自动配置功能,在starter包中引入autoconfigure包,在以后的项目开发中只需要引用starter包即可。
      • starter包中的pom.xml配置文件中引入当前程序所需要的所有依赖
      • autoconfigure包中设置很多自动配置类,声明了bean对象,在SpringBoot项目启动时,会自动加载META-INF/spring和org.springframework.boot.autoconfigure.AutoConfiguration.imports文件(新版本会加载),自动配置类配置好了之后,可以在上述两个文件中配置这些自动配置类,这些自动配置类配置好了之后就会自动加载并通过@Import注解直接加载到Spring的IOC容器中。

    命名规范

    • 官方起步依赖命名规范
      • spring-boot-starter-{name},其中,{name}是起步依赖的名称,用于描述该起步依赖所提供的功能或模块。一般情况下,{name}应该是一个简短、清晰的描述词,以表明该起步依赖的用途。例如,常见的Spring Boot起步依赖命名规范如下:

      • spring-boot-starter-web:用于构建Web应用程序的起步依赖。
      • spring-boot-starter-data-jpa:用于集成JPA(Java Persistence API)的起步依赖。
      • spring-boot-starter-test:用于编写测试的起步依赖。
    • 第三方起步依赖命名规范
      • {project-name}-starter:使用项目或库的名称作为起步依赖的前缀,例如myproject-starter。
      • {library-name}-spring-boot-starter:将库的名称与Spring Boot起步依赖的命名规范结合,例如mybatis-spring-boot-starter。
      • {project-name}-autoconfigure:用于自动配置的起步依赖,例如myproject-autoconfigure。
      • {library-name}-client:用于访问某个服务或API的客户端起步依赖,例如mylibrary-client。

    自定义starter案例

    分析
    • 需求:自定义aliyun-oss-springboot-starter,完成阿里云OSS操作工具类AliyunOSSUtils的自动装配
    • 目标:引入起步依赖之后,想要使用阿里云OSS,注入AliyunOSSUtils直接使用即可
    步骤
    • 创建aliyun-oss-spring-boot-starter的maven模块(实现依赖管理的功能)
    • 创建aliyun-oss-spring-boot-autoconfigure的maven模块,在starter中引入该模块(实现自动配置功能)
    • 在aliyun-oss-spring-boot-autoconfigure模块中定义自动配置功能,并定义自动配置文件META-INF/spring/xxxx.imports(自动配置类的全类名)
    具体实现
    starter包
    • 引入auto configure包即可
    autoconfigure包
    • 具体来实现将哪些自动配置类以及自动配置类中的bean对象载入SpringIOC容器中进行管理
    • 并且自动配置类的全类名要放在META-INF/spring/xxxx.imports文件中,这样在SpringBoot项目引入starter依赖时,才能将上述文件夹中的自动配配置类进行加载注入到SpringIOC容器中。
    •  其中AliOSSUtils(具体实现工具类的功能)和AliOSSProperties(实体类,用于封装数据)
      • AliOSSUtils类
        1. package com.aliyun.oss;
        2. import org.springframework.web.multipart.MultipartFile;
        3. import java.io.IOException;
        4. import java.io.InputStream;
        5. import java.util.UUID;
        6. /**
        7. * 阿里云 OSS 工具类
        8. */
        9. public class AliOSSUtils {
        10. // // todo 指定OSS服务地址
        11. // @Value("${aliyun.oss.endpoint}")
        12. // private String endpoint;
        13. // // todo 设置密钥账号和密码
        14. // @Value("${aliyun.oss.accessKeyId}")
        15. // private String accessKeyId;
        16. // @Value("aliyun.oss.accessKeySecret")
        17. // private String accessKeySecret;
        18. // // todo 设置文件存储buket
        19. // @Value("aliyun.oss.bucketName")
        20. // private String bucketName;
        21. // todo 注入实体类对象
        22. private AliOSSProperties aliOSSProperties;
        23. public AliOSSProperties getAliOSSProperties() {
        24. return aliOSSProperties;
        25. }
        26. public void setAliOSSProperties(AliOSSProperties aliOSSProperties) {
        27. this.aliOSSProperties = aliOSSProperties;
        28. }
        29. /**
        30. * 实现上传图片到OSS
        31. */
        32. public String upload(MultipartFile file) throws IOException {
        33. // todo 获取已经封装了的属性值
        34. String endpoint = aliOSSProperties.getEndpoint();
        35. String accessKeyId = aliOSSProperties.getAccessKeyId();
        36. String accessKeySecret = aliOSSProperties.getAccessKeySecret();
        37. String bucketName = aliOSSProperties.getBucketName();
        38. // 获取上传的文件的输入流
        39. InputStream inputStream = file.getInputStream();
        40. // 避免文件覆盖
        41. String originalFilename = file.getOriginalFilename();
        42. String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
        43. //上传文件到 OSS
        44. OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
        45. ossClient.putObject(bucketName, fileName, inputStream);
        46. //文件访问路径
        47. String url = endpoint.split("//")[0] + "//" + bucketName + "." + endpoint.split("//")[1] + "/" + fileName;
        48. // 关闭ossClient
        49. ossClient.shutdown();
        50. return url;// 把上传到oss的路径返回
        51. }
        52. }
      • AliOSSProperties类

        1. package com.aliyun.oss;
        2. import org.springframework.boot.context.properties.ConfigurationProperties;
        3. @ConfigurationProperties(prefix = "aliyun.oss") // 设置属性前缀,便于找到对应在yml映射文件中的属性位置
        4. public class AliOSSProperties {
        5. private String endpoint;
        6. private String accessKeyId;
        7. private String accessKeySecret;
        8. private String bucketName;
        9. public String getEndpoint() {
        10. return endpoint;
        11. }
        12. public void setEndpoint(String endpoint) {
        13. this.endpoint = endpoint;
        14. }
        15. public String getAccessKeyId() {
        16. return accessKeyId;
        17. }
        18. public void setAccessKeyId(String accessKeyId) {
        19. this.accessKeyId = accessKeyId;
        20. }
        21. public String getAccessKeySecret() {
        22. return accessKeySecret;
        23. }
        24. public void setAccessKeySecret(String accessKeySecret) {
        25. this.accessKeySecret = accessKeySecret;
        26. }
        27. public String getBucketName() {
        28. return bucketName;
        29. }
        30. public void setBucketName(String bucketName) {
        31. this.bucketName = bucketName;
        32. }
        33. }
    • AliOSSAutoConfiguration自动配置类是为了将配置类以及配置类中bean对象注入SpringIOC容器中(即将需要自动配置的bean都定义在该自动配置类中),同时在bean对象中需要使用第三方的bean可以直接在方法的参数中添加需要使用的第三方bean对象
        1. package com.aliyun.oss;
        2. import org.springframework.boot.context.properties.EnableConfigurationProperties;
        3. import org.springframework.context.annotation.Bean;
        4. import org.springframework.context.annotation.Configuration;
        5. @Configuration
        6. @EnableConfigurationProperties(AliOSSProperties.class) // todo 将该类注入IOC容器,成为其中过的bean对象
        7. public class AliOSSAutoConfiguration {
        8. @Bean
        9. public AliOSSUtils aliOSSUtils(AliOSSProperties aliOSSProperties) {
        10. AliOSSUtils aliOSSUtils = new AliOSSUtils();
        11. aliOSSUtils.setAliOSSProperties(aliOSSProperties);
        12. return aliOSSUtils;
        13. }
        14. }
      • META-INF/spring/xxxx.imports文件(设置自动配置类的全类名)

        • com.aliyun.oss.AliOSSAutoConfiguration

  • 相关阅读:
    CAPL中的键值对(hash)数据类型
    Springboot毕业设计毕设作品,纯净水商城配送系统 开题报告
    【QT】事件分发器/事件过滤器/事件处理的介绍和使用
    全国中职网络安全B模块之国赛题远程代码执行渗透测试 //PHPstudy的后门漏洞分析
    怎么判断MES系统好不好?MES又是如何帮企业省钱的?
    互联网被裁的程序员,未来有什么方向呢?
    Go语言数据类型-函数
    前端面试题总结(一)
    Jetsonnano B01 笔记6:开启USB摄像头
    基于GoFrame+Vue+ElementUI的小程序后台管理系统
  • 原文地址:https://blog.csdn.net/weixin_64939936/article/details/132782782