@Value和@ConfigurationProperties的区别,以及@ConfigurationProperties的配置依赖
@Value
和@ConfigurationProperties
都是Spring框架中用于注入配置属性的注解,但@Value
和@ConfigurationProperties
都是Spring框架中用于注入配置属性的注解,但它们之间有一些区别:
1.来源不同:
@Value
:用于从简单的属性文件中注入值,如application.properties或application.yml。@ConfigurationProperties
:用于从带有嵌套属性的复杂配置文件中注入值,如application.yml。
2.类型安全:
@Value
:不支持类型安全,需要使用字符串拼接或者第三方库(如Apache Commons BeanUtils)进行类型转换。@ConfigurationProperties
:支持类型安全,通过自动绑定和类型转换实现。
3.复杂性:
@Value
:适用于简单的属性注入场景。@ConfigurationProperties
:适用于复杂的配置文件场景,可以处理嵌套属性、列表、集合等。
4.自定义属性:
@Value
:不支持自定义属性。@ConfigurationProperties
:支持自定义属性,可以通过prefix
、ignoreInvalidFields
等参数进行配置。
配置文件如下:
spring:
#文件上传的配置
servlet:
multipart:
max-file-size: 10MB
max-request-size: 100MB
#数据库连接信息
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/tlias
username: root
password: chen
#Mybatis配置
mybatis:
configuration:
log-impl: org.apache.ibatis.logging.stdout.StdOutImpl
map-underscore-to-camel-case: true
aliyun:
oss:
endpoint: https://oss-cn-hangzhou.aliyuncs.com
accessKeyId: LTAI5tHmxxxxxxPbPg3Acs
accessKeySecret: 5dywdOaBWzNsGXxxxxlias
使用@Value的注解方式:
@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;
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
// 获取上传的文件的输入流
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的路径返回
}
}
使用@ConfigurationProperties的方式注入:
首先配置依赖:
<!-- 添加ConfigurationProperties-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
</dependency>
定义一个属性类:
@Data
@Component
@ConfigurationProperties(prefix = "aliyun-oss")
public class AliOSSUtilsProperties {
private String endpoint;
private String accessKeyId;
private String accessKeySecret;
private String bucketName;
}
说明一下,@Date是getter和setter方法的注入,也是需要引入相关的依赖的lambok
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
将私有化的属性对象,引入到相关类中:
@Component
public class AliOSSUtils {
private AliOSSUtilsProperties aliOSSUtilsProperties;
/**
* 实现上传图片到OSS
*/
public String upload(MultipartFile file) throws IOException {
String accessKeyId = aliOSSUtilsProperties.getAccessKeyId();
String bucketName = aliOSSUtilsProperties.getBucketName();
String endpoint = aliOSSUtilsProperties.getEndpoint();
String accessKeySecret = aliOSSUtilsProperties.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的路径返回
}
}
总的来说,@Value是引入较少的配置信息,而@ConfigurationPorperties是针对引入较多的依赖!
完结,撒花!