目录
- 读取配置文件属性
- @Value注解
- 在配置文件中编写一些属性(application.yml)
- FileConfig类
- 单元测试
- @ConfigurationProperties
- Environment对象
- Properties读取
- @PropertySource
- 静态变量读取配置文件属性
- Bean内部代码加载顺序
- Bean与Bean之前的执行顺序
- @Configuration注解与@Component注解的区别
- 为什么@Configuration注解与@Component注解装配的bean执行顺序不一样?
- 总结
- @Value注解
读取配置文件属性
前不久刚优化了一个关于文件上传这块的代码,这里面就涉及到图片的路径问题,我将某些属性配置到了配置文件,但是在优化过程中,让我对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会默认去掉属性名中间的特殊符号ÿ