通州上海网站建设,大型html5浅蓝色网站设计公司dede模板,个人网站免费域名获取,怀化 优化营商环境4. 配置文件
员工管理的增删改查功能我们已开发完成#xff0c;但在我们所开发的程序中还一些小问题#xff0c;下面我们就来分析一下当前案例中存在的问题以及如何优化解决。
4.1 参数配置化 在我们之前编写的程序中进行文件上传时#xff0c;需要调用AliOSSUtils工具类但在我们所开发的程序中还一些小问题下面我们就来分析一下当前案例中存在的问题以及如何优化解决。
4.1 参数配置化 在我们之前编写的程序中进行文件上传时需要调用AliOSSUtils工具类将文件上传到阿里云OSS对象存储服务当中。而在调用工具类进行文件上传时需要一些参数 endpoint // 阿里云OSS域名 accessKeyID // 用户身份ID accessKeySecret // 用户密钥 bucketName // 存储空间的名字
关于以上的这些阿里云相关配置信息我们是直接写死在Java代码中了(硬编码)如果我们在做项目时每涉及到一个第三方技术服务就将其参数硬编码那么在Java程序中会存在两个问题 如果这些参数发生变化了就必须在源程序代码中改动这些参数然后需要重新进行代码的编译将Java代码编译成class字节码文件再重新运行程序。比较繁琐 如果我们开发的是一个真实的企业级项目 Java类可能会有很多如果将这些参数分散的定义在各个Java类当中我们要修改一个参数值我们就需要在众多的Java代码当中来定位到对应的位置再来修改参数修改完毕之后再重新编译再运行。参数配置过于分散导致不方便集中的管理和维护 思考怎样将这些参数集中配置管理呢
回答Java代码会有很多这毋庸置疑但是对于SpringBoot项目来说什么东西一般只有一个配置文件只有一个代码当中所有容易变动的参数建议放在配置文件当中进行管理和维护也就是application.properties。 将参数集中保存/配置在properties配置文件当中的优点 在application.properties当中的配置做了修改我们不用进行编译而且所有的配置如果都交给了application.properties配置文件来集中管理以后如果我们想修改我们直接找到properties配置文件来做一个修改就可以了软编码。其次安全敏感的参数(如数据库连接密码)不应该直接硬编码在代码中而是通过配置文件进行管理这样可以降低配置泄漏的风险并更好的保护敏感信息。灵活性和可移植性不同环境的参数配置只需在对应的配置文件中进行修改即可。易用性和可读性将参数配置到配置文件中使得参数的设置更加直观和易于理解提高配置文件的可读性和维护性。 注意这里的配置文件指的可不是pom.xmlpom.xml这份配置文件是Maven项目的配置文件是用来配置依赖的而application.properties才是SpringBoot项目的配置文件。
为了解决以上分析的问题我们可以将参数配置在配置文件中。而application.properties配置文件的形式就是key value前面的key可以自己定义注意在项目开发时尽量要定义的有一定的业务含义如下
问题解决
#自定义的阿里云OSS配置信息
aliyun.oss.endpointhttps://oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyIdLTAI5tHGMz3QSEMrwu6wSmSC
aliyun.oss.accessKeySecret4yBkKaSJvvqobtnK36fTGXiPreqh5P
aliyun.oss.bucketNamegch-web-tlias01
注意 由于properties配置文件当中的信息本身就是一个字符串所以我们就不需要再来加引号后面的分号也不需要等号两边的空格也不需要。 在将阿里云OSS配置参数交给properties配置文件来管理之后我们的AliOSSUtils工具类就变为以下形式
/*** 使用阿里云OSS进行文件存储的工具类*/
Component
public class AliyunOSSUtils {/** 以下4个参数没有指定值默认值null*//** 指定连接的阿里云OSS服务的地址 */private String endpoint;/** 阿里云OSS AccessKey */private String accessKeyId;private String accessKeySectre;/** 存储空间Bucket的名称 */private String bucketName;//省略其他代码...
}
而此时如果直接调用AliOSSUtils类当中的upload方法进行文件上传时这4项参数全部为null原因是因为并没有给它赋值。
此时我们是不是需要将配置文件当中所配置的属性值读取出来并分别赋值给AliOSSUtils工具类当中的各个属性呢那应该怎么做呢
想法IO流通过IO流读取并解析配置文件当中配置项的值然后再给成员变量赋值。 因为application.properties是springboot项目默认的配置文件所以SpringBoot程序在启动时会默认读取application.properties配置文件而我们可以使用SpringBoot提供一个的现成的注解Value获取配置文件中的数据。 Value 注解通常用于外部配置的属性注入具体用法为 Value(${配置文件中的key}) 通过Value注解进行属性注入将外部的属性配置注入进来赋值给成员变量在Value注解当中来指定我们要注入的是配置文件当中的哪一个Key对应的属性值。 /*** 使用阿里云OSS进行文件存储的工具类*/
Component
public class AliyunOSSUtils {/** 指定连接的阿里云OSS服务的地址 */Value(${aliyun.oss.endpoint})private String endpoint;/** 阿里云OSS AccessKey */Value(${aliyun.oss.accessKeyId})private String accessKeyId;Value(${aliyun.oss.accessKeySecret})private String accessKeySecret;/** 存储空间Bucket的名称 */Value(${aliyun.oss.bucketName})private String bucketName;
}
总结 如果在项目开发当中我们需要用到一些技术或者是服务我们就可以把这个技术或者是服务它在运行时所需要的参数直接配置在配置文件当中交给配置文件进行统一的管理和维护然后在程序当中我们就可以通过Value注解来注入对应的外部配置的属性值。 4.2 yml配置文件
全新格式的配置文件 - yml配置文件
在SpringBoot项目当中是支持多种配置方式的前面我们一直使用SpringBoot项目创建完毕后自带的application.properties配置文件进行属性的配置properties配置文件的配置形式就是键值对KeyValue等号之前是Key等号之后是Value那其实呢在SpringBoot项目当中是支持多种配置方式的除了支持properties配置文件以外还支持另外一种类型的配置文件就是我们接下来要学习的yml格式的配置文件。
yml格式的配置文件它的后缀可以是yml(推荐)也可以是yaml这两个配置文件它的配置形式都是相同的仅仅是后缀名不同而已。如果是yml格式的配置文件配置文件的名字也必须叫做application.yml。 yml 格式的配置文件后缀名有两种 yml 推荐 yaml SpringBoot提供了多种属性配置方式 / SpringBoot所支持的配置文件 application.properties server.port8080
server.address127.0.0.1application.yml server:port: 8080address: 127.0.0.1 application.yaml server:port: 8080address: 127.0.0.1 可以看到在SpringBoot当中所支持的这三种配置文件配置文件的名字都是相同的都叫applictaion只是文件扩展名不同而已。如果是yml格式的配置文件它的配置形式是键值对KeyValue而且这个Key还是按照层级书写的相比于传统的properties格式YAML格式的配置文件使用缩进和结构化语法来表示数据的层级关系。 层级结构YAML配置文件使用缩进来表示层级关系前面的缩进相同代表它们的层级也相同。比如我们要配置服务器运行的端口号server.port 在上面的示例中port、host 和 timeout 是 server 的子属性它们位于不同的缩进级别。 2. 键值对(对象/Map集合)YAML 使用冒号:来表示键值对。冒号后面是一个空格然后是相应的值。 在上面的示例中url、username 和 password 是 database 的子属性。 3. 列表(数组/List/Set集合)YAML 支持表示列表数据的方式使用短横线-表示列表中的项目。 在上面的示例中fruits 是一个包含三个元素的列表。 4. 注释使用井号#表示注释。井号后面的内容将被视为注释不会被解析。 在上面的示例中井号后面的内容是注释不会影响配置的读取和解析。 这些是 YAML 配置文件的一些常见形式。通过使用缩进、键值对、列表和注释等语法规则YAML 配置文件可以更清晰和易读地表示数据的结构和层级关系。 在SpringBoot的resources目录下来创建一份儿applictaion.yml格式的配置文件创建后可以看到在我们所创建出来的application.yml格式的配置文件前面多了一个SpringBoot的Logo这就说明SpringBoot是识别这份配置文件的。 application.yml 演示输入server之后给出自动提示我们要配置的是SpringBoot内嵌的Tomcat服务器运行的端口号默认是8080我们可以修改内嵌的Tomcat服务器端口号为9000 常见的三类配置文件格式的优缺点对比 在XML配置文件当中我们要定义很多的标签既要定义开始标签又要定义结束标签既有父标签也有子标签虽然层级结构比较清晰但是配置比较臃肿properties配置文件相对于XML配置文件来说会更加轻量化一些它的配置格式是键值对KeyValue但是在项目开发当中我们经常会使用大量的框架以及第三方的技术而在使用框架时我们又需要在配置文件当中来配置很多的参数而在框架当中为了让这个Key更加的简明知意并且具有一定的标识意义所以这个Key通常来说都是分层级的如果用properties配置文件来配置那就是平铺直叙层级结构并不清晰而且这个Key越复杂层级架构约不清晰所以properties配置文件相对于XML配置文件来说它会更加轻量化一些但是它并没有XML配置文件结构清晰。 如果采用yml格式来配置这个层级结构就会更加清晰没有一点儿多余的配置而且通过该配置结构可以更清晰的表示数据的结构和层级关系完全以数据为中心简洁没有一点儿多余的配置。
在SpringBoot当中仅支持properties和yml格式的配置而在现在的企业开发当中SpringBoot项目基本上采用的都是yml格式的配置文件很少使用properties所以推荐使用yml格式的配置文件。
对于yaml格式的配置文件我们一般会选择yml这个拓展名更加简单。
我们可以看到配置同样的数据信息yml格式的数据有以下特点 - 容易阅读- 容易与脚本语言交互- 以数据为核心重数据轻格式 简单的了解过SpringBoot所支持的配置文件以及不同类型配置文件之间的优缺点之后接下来我们就来了解下yml配置文件的基本语法 大小写敏感 数值前边必须有空格作为分隔符 使用缩进表示层级关系缩进时不允许使用Tab键只能用空格对于现在的开发工具来说使用Tab制表符或者空格无所谓因为高级开发工具idea中会自动的将yml格式配置文件当中的Tab转换为空格 缩进的空格数目不重要只要相同层级的元素左侧对齐即可 #表示注释从这个字符一直到行尾都会被解析器忽略 yml文件当中常见的两类数据格式
在这里我们主要介绍最为常见的两类 定义对象或Map集合 定义数组、List或Set集合
对象/Map集合 数组/List/Set集合 总结 4.3 yml配置
熟悉完了yml文件的基本语法后我们修改下之前案例中使用的配置文件变更为application.yml配置方式
在application.yml中配置案例相关的配置项接着删除传统的application.properties配置文件
对比
原有的application.properties配置文件
#数据库连接
#驱动类名称
spring.datasource.driver-class-namecom.mysql.cj.jdbc.Driver
#数据库连接的URL
spring.datasource.urljdbc:mysql://localhost:3306/tlias
#连接数据库的用户名
spring.datasource.usernameroot
#连接数据库的密码
spring.datasource.password123456#开启mybatis的日志输出{配置MyBatis的日志,指定输出到控制台}
mybatis.configuration.log-implorg.apache.ibatis.logging.stdout.StdOutImpl
#开启数据库表字段 到 实体类属性的驼峰映射 a_column --- aColumn
mybatis.configuration.map-underscore-to-camel-casetrue#PageHelper分页插件的配置
#配置数据库方言
pagehelper.helper-dialectmysql
#分页合理化参数配置
pagehelper.reasonabletrue#配置单个文件最大上传大小的限制,默认是1MB
spring.servlet.multipart.max-file-size10MB
#配置单个请求最大上传大小的限制(一次请求可以上传多个文件),默认是10MB
spring.servlet.multipart.max-request-size100MB#自定义的阿里云OSS配置信息
aliyun.oss.endpointhttps://oss-cn-beijing.aliyuncs.com
aliyun.oss.accessKeyIdLTAI5tHGMz3QSEMrwu6wSmSC
aliyun.oss.accessKeySecret4yBkKaSJvvqobtnK36fTGXiPreqh5P
aliyun.oss.bucketNamegch-web-tlias01
新建的application.yml配置文件
#注意,yml格式的配置是键值对Key: Value,并且是Key: 空格 Value
#数据库连接四要素
spring:datasource:#驱动类名称driver-class-name: com.mysql.cj.jdbc.Driver#数据库连接的URLurl: jdbc:mysql://localhost:3306/tlias#连接数据库的用户名username: root#连接数据库的密码password: 123456#文件上传的配置(关键字:multipart)servlet:multipart:#配置单个文件最大上传大小的限制,默认是1MBmax-file-size: 10MB#配置单个请求最大上传的大小的限制(一次请求可以上传多个文件),默认是10MBmax-request-size: 100MB#MyBatis配置(关键字camel、log-impl)
mybatis:configuration:#开启MyBatis的日志输出{配置MyBatis的日志,指定输出到控制台}log-impl: org.apache.ibatis.logging.stdout.StdOutImpl#开启数据库表字段 到 实体类属性的驼峰映射 a_column --- aColumnmap-underscore-to-camel-case: true#PageHelper分页插件的配置
pagehelper:#配置数据库方言helper-dialect: mysql#分页合理化参数配置reasonable: true#自定义的阿里云OSS配置信息
aliyun:oss:#OSS对象存储服务的域名endpoint: https://oss-cn-beijing:aliyuncs:com#阿里云账号AccessKeyaccessKeyId: LTAI5tHGMz3QSEMrwu6wSmSC#阿里云账号AccessKey对应的密钥accessKeySecret: 4yBkKaSJvvqobtnK36fTGXiPreqh5P#存储空间Bucket的名称bucketName: gch-web-tlias01#配置服务器相关信息
server:port: 8080address: 127.0.0.1#定义对象/Map集合(key:Value)
user:name: Tomage: 18password: 20#数组/List/Set集合(列表):使用短横线-表示列表中的项目
hobby:-java-game-sport
4.4 ConfigurationProperties
注解ConfigurationProperties
学习完了yml配置文件之后最后再来介绍一个注解ConfigurationProperties。在介绍注解之前我们先来看一个场景分析下代码当中可能存在的问题 我们在application.properties或者application.yml中配置了阿里云OSS的四项参数之后如果Java程序中需要这四项参数数据我们直接通过Value注解来进行注入通过Value注解来注入外部配置文件当中的属性值并且在Value注解当中要通过${}的形式来指定我们要注入的是哪一个配置项的值这种方式本身没有什么问题问题但是如果说需要注入的属性较多(例需要20多个参数数据)每一个属性/成员变量上都需要加上这么一个Value注解导致我们整个编码写起来就会比较繁琐而且比较臃肿。
那么有没有一种方式可以简化这些配置参数的注入呢我们不用在每一个成员变量上都加上这个Value注解就可以自动的将配置文件当中配置项的值直接注入给这个对象的属性当中来呢
答案是肯定的在Spring中给我们提供了一种简化方式可以直接将配置文件中配置项的值自动的注入到对象的属性当中但是它是有前提条件的(Spring提供的简化方式套路) 需要创建一个实体类并且配置文件当中Key的名字必须要和实体类当中的属性名保持一致(比如配置文件当中叫endpoints实体类当中的属性也得叫endpoints )并且还要为实体类属性提供Getter/Setter方法所以在实体类上面要加上Data注解需要将实体类的实例交给IOC/Spring容器管理成为IOC/Spring容器当中的bean对象所以需要在实体类上面加上Component注解当前bean对象当中的属性还不能够完成自动注入原因是因为现在仅仅是这个bean对象的属性名与配置项的后缀保持一致了而配置项前面还有一个前缀所以我们还需要指定一下配置项的前缀指定前缀我们就可以使用ConfigurationProperties这个注解来指定我们只需要在实体类上面加上ConfigurationProperties注解并通过prefix属性来指定配置项的前缀此时就代表我需要将该前缀下面的子属性/子配置项对应的值自动的注入到实体类对象(bean对象)当中的属性当中来。 此时在其他类当中我们要想获取配置项对应的属性值那我们只需要注入该实体类的bean对象然后调用它的get方法就可以获取到对应的属性值了。 prefix前缀 configuration配置 实体类AliyunOSSProperties
package com.gch.utils;import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;/**阿里云OSS相关配置:将配置文件当中配置项的值自动的注入到bean对象的属性当中*/
Data
Component
ConfigurationProperties(prefix aliyun.oss)
public class AliyunOSSProperties {/** 指定连接的阿里云OSS对象存储服务的域名/地址 */private String endpoint;/** 阿里云OSS账号AccessKey身份ID */private String accessKeyId;/** 阿里云OSS账号AccessKey身份ID对应的密钥 */private String accessKeySecret;/** 存储空间Bucket的名称 */private String bucketName;
}AliyunOSSUtils
package com.gch.utils;import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.PutObjectRequest;
import com.aliyun.oss.model.PutObjectResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.IOException;
import java.util.UUID;/**使用阿里云OSS进行文件存储的工具类*/
Component // 当前类对象由Spring创建和管理
public class AliyunOSSUtils {/** 注入配置参数实体类对象 */Autowiredprivate AliyunOSSProperties aliyunOSSProperties;/*** 实现文件上传到OSS* param multipartFile 在服务端来接收到上传的文件* return 返回图片访问的URL* throws IOException*/public String upload(MultipartFile multipartFile) throws IOException {// 获取阿里云OSS参数String endpoint aliyunOSSProperties.getEndpoint();String accessKeyId aliyunOSSProperties.getAccessKeyId();String accessKeySecret aliyunOSSProperties.getAccessKeySecret();String bucketName aliyunOSSProperties.getBucketName();/** 构造唯一的文件对象名称:UUID 文件扩展名 */String objectName UUID.randomUUID().toString() multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(.));// 创建OSSClient实例。OSS ossClient new OSSClientBuilder().build(endpoint,accessKeyId,accessKeySecret);try {// 创建PutObjectRequest对象。PutObjectRequest putObjectRequest new PutObjectRequest(bucketName, objectName, multipartFile.getInputStream());// 上传文件到OSSPutObjectResult result ossClient.putObject(putObjectRequest);} finally {if (ossClient ! null) {// 关闭ossClientossClient.shutdown();}}// 返回文件访问路径return endpoint.split(//)[0] // bucketName . endpoint.split(//)[1] / objectName;}
}重新启动项目 总结
通过ConfigurationProperties注解就可以自动的将配置文件当中的配置项自动的注入到bean对象的属性当中来。
在我们添加上注解后会发现IDEA窗口上面出现一个红色警告 这个警告提示是告知我们还需要引入一个依赖
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-configuration-processor/artifactId
/dependency
当我们在pom.xml文件当中配置了这项依赖之后我们重新启动服务大家就会看到在properties或者是yml配置文件当中就会提示阿里云 OSS 相关的配置项。所以这项依赖它的作用就是会自动的识别被ConfigurationProperties注解标识的bean对象然后在配置文件当中配置的时候就会自动的提示与这个bean对象的属性名相对应的配置项的名字。
注意刚才的红色警告已经变成了一个灰色的提示提示我们需要重新运行SpringBoot服务 4.5 ConfigurationProperties 与 Value
相同点都是用来注入外部配置的属性的。
不同点 Value注解只能一个一个的进行外部属性的注入。 ConfigurationProperties注解可以批量的将外部的属性配置注入到bean对象的属性中。 如果要注入的属性非常的多并且还想做到复用就可以定义这么一个bean对象通过 ConfigurationProperties 批量的将外部的属性配置直接注入到bean对象的属性当中。在其他的类当中我要想获取到注入进来的属性我直接注入bean对象然后调用 get 方法就可以获取到对应的属性值了。
总结