@configuration 中@value不生效_由@Value注解引发的一次对bean的思考,值得一看

本文深入探讨了在Spring中如何读取配置文件属性,尤其是@Value、@ConfigurationProperties的使用。通过示例展示了Environment对象、@PropertySource的读取方式。同时,文章揭示了在使用静态变量读取配置时遇到的问题及解决方案,分析了Bean内部代码加载顺序和@Configuration与@Component装配bean的执行顺序差异,帮助读者深化对Spring配置注解和bean生命周期的理解。
摘要由CSDN通过智能技术生成

42974420a5d85d2ee7d988c23cc5b3ba.png

目录

  • 读取配置文件属性
    • @Value注解
      • 在配置文件中编写一些属性(application.yml)
      • FileConfig类
      • 单元测试
    • @ConfigurationProperties
    • Environment对象
    • Properties读取
    • @PropertySource
    • 静态变量读取配置文件属性
    • Bean内部代码加载顺序
    • Bean与Bean之前的执行顺序
    • @Configuration注解与@Component注解的区别
    • 为什么@Configuration注解与@Component注解装配的bean执行顺序不一样?
    • 总结

读取配置文件属性

前不久刚优化了一个关于文件上传这块的代码,这里面就涉及到图片的路径问题,我将某些属性配置到了配置文件,但是在优化过程中,让我对bean有了新的认识,既然牵扯到配置文件属性的读取,那么我们先来看看怎么获取配置文件的属性。

@Value注解

在配置文件中编写一些属性(application.yml)

server:
  port: 9199

file:
  server-name: oss.file.com/    #服务器的域名
  mapper: file/    #映射的名字
  images: images/   #存储图片的文件夹
  video: video/        #存放视频的文件夹

FileConfig类

package com.ymy.config;

import lombok.Data;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Configuration;

@Data
@Configuration
public class FileConfig {
    
    /** * 服务器名称 */
    @Value("${file.server-name}")
    private  String serverName;

    /** * 映射 */
    @Value("${file.mapper}")
    private String mapper;

    /** * 存放图片的文件夹 */
    @Value("${file.images}")
    private String images;


    /** * 存放视频的文件夹 */
    @Value("${file.video}")
    private String video;

}

@Data:lombok依赖中的注解,它会生成对应的get、Set、toString方法,简便了我们的代码量。@Configuration 装配,被它装配的bean,回被spring的上下文扫描,这个有点类似springmvc的xml配中的bean,这个注解一定要加,否者读取不到配置文件,当然也可以替换成@Component。@Value:用于读取配置文件的属性,格式 ${对应配置文件中的属性}。

单元测试

package com.ymy;

import com.ymy.config.FileConfig;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;

@SpringBootTest
@Slf4j
class StaticConfigVarApplicationTests {

    @Autowired
    private FileConfig fileConfig;

    @Test
    void valueTest() {
        //比如images目录下存放着一张123.jpg的图片;video目录下存放着123.mp4
        log.info("服务名:{},映射:{},存储图片的文件夹:{},存放视频的文件夹:{}",fileConfig.getServerName(),fileConfig.getMapper(),fileConfig.getImages(),fileConfig.getVideo());
        log.info("图片目录:{}",fileConfig.getServerName()+fileConfig.getMapper()+fileConfig.getImages()+"123.jpg");
        log.info("视频目录:{}",fileConfig.getServerName()+fileConfig.getMapper()+fileConfig.getVideo()+"123.mp4");
    }

}

测试结果如下:

2020-03-19 15:56:42.227  INFO 19884 --- [           main] com.ymy.StaticConfigVarApplicationTests  : 服务名:oss.file.com/,映射:file/,存储图片的文件夹:images/,存放视频的文件夹:video/
2020-03-19 15:56:42.229  INFO 19884 --- [           main] com.ymy.StaticConfigVarApplicationTests  : 图片目录:oss.file.com/file/images/123.jpg
2020-03-19 15:56:42.230  INFO 19884 --- [           main] com.ymy.StaticConfigVarApplicationTests  : 视频目录:oss.file.com/file/video/123.mp4

看到这样的结果,说明读取配置文件已经成功了,但是这个还有一点让我很不爽,那就是FileConfig对象还需要注入,能不能不通过注入就能拿到配置文件的属性呢?这个我等会再说,我们来看看还有没有其他读取配置文件的方式呢?答案肯定是有的,接着往下看。

@ConfigurationProperties

它的实现方式很简单,只需要改动一个地方即可,请看代码:

package com.ymy.config;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Configuration;

@Data
@Slf4j
@Configuration
@ConfigurationProperties(prefix = "file")
public class FileConfig {

    /** * 服务器名称 */
    //@Value("${file.server-name}")
    private  String serverName;

    /** * 映射 */
    //@Value("${file.mapper}")
    private String mapper;

    /** * 存放图片的文件夹 */
    //@Value("${file.images}")
    private String images;


    /** * 存放视频的文件夹 */
   // @Value("${file.video}")
    private String video;
}

我们在属性上去掉了@Value注解,在bean中加入了:@ConfigurationProperties(prefix = “file”)。@ConfigurationProperties():这个注解可以让bean的属性与配置文件的属性一一对应,prefix:配置文件的前缀,格式要求:bean属性要与配置文件的属性名相同。

其他代码都不需要改动,我们直接运行单元测试:

2020-03-19 16:21:00.271  INFO 1456 --- [           main] com.ymy.StaticConfigVarApplicationTests  : 服务名:oss.file.com/,映射:file/,存储图片的文件夹:images/,存放视频的文件夹:video/
2020-03-19 16:21:00.273  INFO 1456 --- [           main] com.ymy.StaticConfigVarApplicationTests  : 图片目录:oss.file.com/file/images/123.jpg
2020-03-19 16:21:00.273  INFO 1456 --- [           main] com.ymy.StaticConfigVarApplicationTests  : 视频目录:oss.file.com/file/video/123.mp4

我们发现同样读取到了配置文件的信息,这种方式要求bean的属性名与配置文件的属性名相同,否者将读取不到,不知道你们有没有发现一个问题,那就是FileConfig定义的服务器名称是:serverName,配置文件配置的是:server-name,很神奇的是他居然找到了,为什么呢?@ConfigurationProperties会默认去掉属性名中间的特殊符号ÿ

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值