@data注解_由@Value注解引发的一次对bean的思考,值得一看

02c9ebf617692db6744bed58f49b5c82.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会默认去掉属性名中间的特殊符号,并且不区分大小写

Environment对象

上面的两种读取方式可能很多人都知道,但是有人了解过Environment这个对象吗?

Environment是集成在容器中的抽象,它为 application 环境的两个 key 方面建模:profiles和properties。

profile 是 bean 定义的命名逻辑 group,仅当给定的 profile 为 active 时才向容器注册。 Beans 可以分配给 profile,无论是用 XML 定义还是通过 annotations 定义。与 profiles 相关的Environment object 的作用是确定哪些 profiles(如果有)当前是 active,以及哪些 profiles(如果有)默认情况下应该 active。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值