当前位置: 首页 > article >正文

@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:支持自定义属性,可以通过prefixignoreInvalidFields等参数进行配置。

配置文件如下:

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是针对引入较多的依赖! 

完结,撒花!


http://www.kler.cn/news/150215.html

相关文章:

  • 详解前后端交互时PO,DTO,VO模型类的应用场景
  • [论文阅读]CT3D——逐通道transformer改进3D目标检测
  • RK3568平台开发系列讲解(Linux系统篇)通过OF函数获取设备树节点实验
  • 云时空社会化商业 ERP 系统 service SQL 注入漏洞复现
  • mySQL踩坑记录
  • 【科技素养】蓝桥杯STEMA 科技素养组模拟练习试卷12
  • 从零构建属于自己的GPT系列1:文本数据预处理、文本数据tokenizer、逐行代码解读
  • SparkSQL远程调试(IDEA)
  • 深入了解Jackson库中的ObjectMapper:Java对象的序列化和反序列化
  • qt 简单了解QHBoxLayout QVBoxLayout QFormLayout水平,垂直,表单布局管理器.
  • BUUCTF刷题之路-pwn-ciscn_2019_n_81
  • Elasticsearch 聚合查询(Aggregation)详解
  • 虚拟机指定开放数据库3306端口
  • Golang开发之------ Beego框架
  • 异步操作的方法
  • genimage 打包镜像
  • ESP32-Web-Server编程- WebSocket 编程
  • leetcode二叉树
  • Spring Boot项目Service类单元测试自动生成
  • TikTok区块链实践:数字社交媒体的去中心化未来
  • 记录一次登录相关bug
  • Hive_last_value()
  • 解决QT信号在信号和槽连接前发出而导致槽函数未调用问题
  • 爬虫代理技术与构建本地代理池的实践
  • 亚马逊云科技向量数据库助力生成式AI成功落地实践探秘(二)
  • Java LeetCode篇-深入了解关于单链表的经典解法
  • Linux命令中的符号
  • 初学者如何入门深度学习:以手写数字字符识别为例看AI 的学习路径,一图胜千言!
  • 福德植保无人机:农业科技的新篇章
  • 小航助学题库蓝桥杯题库c++选拔赛(23年8月)(含题库教师学生账号)