当前位置:   article > 正文

【JavaWeb】Day61.SpringBootWeb案例——配置文件

【JavaWeb】Day61.SpringBootWeb案例——配置文件

配置文件

参数配置化

       在我们之前编写的程序中进行文件上传时,需要调用AliOSSUtils工具类,将文件上传到阿里云OSS对象存储服务当中。而在调用工具类进行文件上传时,需要一些参数:

- endpoint       //阿里云OSS域名

- accessKeyID    //用户身份ID

- accessKeySecret   //用户密钥

- bucketName      //存储空间的名字

       关于以上的这些阿里云相关配置信息,我们是直接写死在java代码中了(硬编码),如果我们在做项目时每涉及到一个第三方技术服务,就将其参数硬编码,那么在Java程序中会存在两个问题:

  1. 如果这些参数发生变化了,就必须在源程序代码中改动这些参数,然后需要重新进行代码的编译,将Java代码编译成class字节码文件再重新运行程序。(比较繁琐) 
  2. 如果我们开发的是一个真实的企业级项目, Java类可能会有很多,如果将这些参数分散的定义在各个Java类当中,我们要修改一个参数值,我们就需要在众多的Java代码当中来定位到对应的位置,再来修改参数,修改完毕之后再重新编译再运行。(参数配置过于分散,是不方便集中的管理和维护)

为了解决以上分析的问题,我们可以将参数配置在配置文件中。如下:

  1. ~~~properties
  2. #自定义的阿里云OSS配置信息
  3. aliyun.oss.endpoint=https://oss-cn-hangzhou.aliyuncs.com
  4. aliyun.oss.accessKeyId=LTAI4GCH1vX6DKqJWxd6nEuW
  5. aliyun.oss.accessKeySecret=yBshYweHOpqDuhCArrVHwIiBKpyqSL
  6. aliyun.oss.bucketName=web-tlias
  7. ~~~

        在将阿里云OSS配置参数交给properties配置文件来管理之后,我们的AliOSSUtils工具类就变为以下形式:

  1. ~~~java
  2. @Component
  3. public class AliOSSUtils {
  4. /*以下4个参数没有指定值(默认值:null)*/
  5. private String endpoint;
  6. private String accessKeyId;
  7. private String accessKeySecret;
  8. private String bucketName;
  9. }
  10. ~~~

        而此时如果直接调用AliOSSUtils类当中的upload方法进行文件上传时,这4项参数全部为null,原因是因为并没有给它赋值。

        因为application.properties是springboot项目默认的配置文件,所以springboot程序在启动时会默认读取application.properties配置文件,而我们可以使用一个现成的注解:@Value,获取配置文件中的数据。

@Value 注解通常用于外部配置的属性注入,具体用法为: @Value("${配置文件中的key}")

  1. ~~~java
  2. @Component
  3. public class AliOSSUtils {
  4. @Value("${aliyun.oss.endpoint}")
  5. private String endpoint;
  6. @Value("${aliyun.oss.accessKeyId}")
  7. private String accessKeyId;
  8. @Value("${aliyun.oss.accessKeySecret}")
  9. private String accessKeySecret;
  10. @Value("${aliyun.oss.bucketName}")
  11. private String bucketName;
  12. }
  13. ~~~

使用postman测试:

yml配置文件

       前面我们一直使用springboot项目创建完毕后自带的application.properties进行属性的配置,那其实呢,在springboot项目当中是支持多种配置方式的,除了支持properties配置文件以外,还支持另外一种类型的配置文件,yml格式的配置文件。

常见配置文件格式对比:

yml 格式的配置文件,后缀名有两种:

 - yml (推荐)

 - yaml

yml配置文件的基本语法:

  • 大小写敏感
  •  数值前边必须有空格,作为分隔符
  •  使用缩进表示层级关系,缩进时,不允许使用Tab键,只能用空格(idea中会自动将Tab转换为空格)
  •  缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
  •  `#`表示注释,从这个字符一直到行尾,都会被解析器忽略

yml文件中常见的数据格式。在这里我们主要介绍最为常见的两类:

1. 定义对象或Map集合

2. 定义数组、list或set集合

对象/Map集合

  1. ```yml
  2. user:
  3. name: zhangsan
  4. age: 18
  5. password: 123456
  6. ```

数组/List/Set集合

  1. ```yml
  2. hobby:
  3. - java
  4. - game
  5. - sport
  6. ```

修改下之前案例中使用的配置文件,变更为application.yml配置方式:

1. 修改application.properties名字为:`_application.properties`(名字随便更换,只要加载不到即可)

2. 创建新的配置文件: `application.yml`

原有application.properties文件:

新建的application.yml文件:

  1. ~~~yaml
  2. spring:
  3. datasource:
  4. driver-class-name: com.mysql.cj.jdbc.Driver
  5. url: jdbc:mysql://localhost:3306/tlias
  6. username: root
  7. password: 1234
  8. servlet:
  9. multipart:
  10. max-file-size: 10MB
  11. max-request-size: 100MB
  12. mybatis:
  13. configuration:
  14. log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
  15. map-underscore-to-camel-case: true
  16. aliyun:
  17. oss:
  18. endpoint: https://oss-cn-hangzhou.aliyuncs.com
  19. accessKeyId: LTAI4GCH1vX6DKqJWxd6nEuW
  20. accessKeySecret: yBshYweHOpqDuhCArrVHwIiBKpyqSL
  21. bucketName: web-397
  22. ~~~

注解@ConfigurationProperties

       我们在application.properties或者application.yml中配置了阿里云OSS的四项参数之后,如果java程序中需要这四项参数数据,我们直接通过@Value注解来进行注入。这种方式本身没有什么问题问题,但是如果说需要注入的属性较多(例:需要20多个参数数据),我们写起来就会比较繁琐。

Spring提供的简化方式套路:

1. 需要创建一个实现类,且实体类中的属性名和配置文件当中key的名字必须要一致

    比如:配置文件当中叫endpoints,实体类当中的属性也得叫endpoints,另外实体类当中的属性还需要提供 getter / setter方法

2. 需要将实体类交给Spring的IOC容器管理,成为IOC容器当中的bean对象

3. 在实体类上添加`@ConfigurationProperties`注解,并通过perfect属性来指定配置参数项的前缀

实体类:AliOSSProperties

  1. ~~~java
  2. import lombok.Data;
  3. import org.springframework.boot.context.properties.ConfigurationProperties;
  4. import org.springframework.stereotype.Component;
  5. /*阿里云OSS相关配置*/
  6. @Data
  7. @Component
  8. @ConfigurationProperties(prefix = "aliyun.oss")
  9. public class AliOSSProperties {
  10. //区域
  11. private String endpoint;
  12. //身份ID
  13. private String accessKeyId ;
  14. //身份密钥
  15. private String accessKeySecret ;
  16. //存储空间
  17. private String bucketName;
  18. }
  19. ~~~

AliOSSUtils工具类:

  1. ~~~java
  2. import com.aliyun.oss.OSS;
  3. import com.aliyun.oss.OSSClientBuilder;
  4. import org.springframework.beans.factory.annotation.Autowired;
  5. import org.springframework.stereotype.Component;
  6. import org.springframework.web.multipart.MultipartFile;
  7. import java.io.IOException;
  8. import java.io.InputStream;
  9. import java.util.UUID;
  10. @Component //当前类对象由Spring创建和管理
  11. public class AliOSSUtils {
  12. //注入配置参数实体类对象
  13. @Autowired
  14. private AliOSSProperties aliOSSProperties;
  15. /**
  16. * 实现上传图片到OSS
  17. */
  18. public String upload(MultipartFile multipartFile) throws IOException {
  19. // 获取上传的文件的输入流
  20. InputStream inputStream = multipartFile.getInputStream();
  21. // 避免文件覆盖
  22. String originalFilename = multipartFile.getOriginalFilename();
  23. String fileName = UUID.randomUUID().toString() + originalFilename.substring(originalFilename.lastIndexOf("."));
  24. //上传文件到 OSS
  25. OSS ossClient = new OSSClientBuilder().build(aliOSSProperties.getEndpoint(),
  26. aliOSSProperties.getAccessKeyId(), aliOSSProperties.getAccessKeySecret());
  27. ossClient.putObject(aliOSSProperties.getBucketName(), fileName, inputStream);
  28. //文件访问路径
  29. String url =aliOSSProperties.getEndpoint().split("//")[0] + "//" + aliOSSProperties.getBucketName() + "." + aliOSSProperties.getEndpoint().split("//")[1] + "/" + fileName;
  30. // 关闭ossClient
  31. ossClient.shutdown();
  32. return url;// 把上传到oss的路径返回
  33. }
  34. }

引入一个依赖:pom.xml

  1. ~~~xml
  2. <dependency>
  3. <groupId>org.springframework.boot</groupId>
  4. <artifactId>spring-boot-configuration-processor</artifactId>
  5. </dependency>
  6. ~~~

当我们在pom.xml文件当中配置了这项依赖之后,我们重新启动服务,就会看到在properties或者是yml配置文件当中,就会提示阿里云 OSS 相关的配置项。所以这项依赖它的作用就是会自动的识别被`@Configuration Properties`注解标识的bean对象。

@ConfigurationProperties注解和@Value注解:

相同点:都是用来注入外部配置的属性的。

不同点:

  1.  @Value注解只能一个一个的进行外部属性的注入。
  2.  @ConfigurationProperties可以批量的将外部的属性配置注入到bean对象的属性中。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/运维做开发/article/detail/987918
推荐阅读
相关标签
  

闽ICP备14008679号