赞
踩
[版权申明] 非商业目的注明出处可自由转载
博文地址:https://blog.csdn.net/ShuSheng0007/article/details/117002443
出自:shusheng007
最近工作的重心逐渐由移动开发转到后端了,由于日常主要精力在移动开发上,以至于对后端的很多知识都停留在理论层面上,实践比较少,一旦动手才发现有点眼高手低。于是我将自己学习的过程记录下来,不然过几天就忘了,一来可以作为自己的学习笔记,二来也能帮助待见我的那些程序猿小伙伴们…
由于SpringBoot注解满天飘,所以对于初学者还是比较懵逼的,因为要是你不从根本上理解Spring的原理,就会觉得这玩意很神奇:为啥加个这样的注解就起作用了呢?到此就是程序员二八分界线了,进一步研究的同学升二,满足于当前状态者落八。
今天我们主要总结一下SpringBoot如何读取配置文件的问题。
SpringBoot 支持两种格式的配置文件,这个相信大家都已经烂熟于心了,这两种格式的文件除了格式上不同,使用上几乎没有差别,喜欢哪种就用哪种吧
下面是同一内容的两种格式,可以感受一下:
database.username=ss007
database.password=wb123
database.server.ip=192.168.1.1
database.server.port=8000
database:
username: ss007
password: wb123
server:
ip: 192.168.1.1
port:8000
当我们新建一个SpringBoot的Maven项目时,默认会在src/main/resources
路径下生成一个application.properties
空配置文件。系统默认就能找到这个文件,神奇吧?因为springboot使用了约定大于配置的思想,很多配置都按照约定配置好了。
那我们如何读取这些配置文件的内容呢?此处总结了三种方式。
将@Value("${配置文件中某个键值对的key}")
注解添加到你要接收值的字段上即可,如下所示:
@Repository
public class UserModel {
@Value("${database.username}")
private String userName;
//不需要setter
}
@Repository
是一种@Component
,通过它Spring就扫描到这个类,然后帮助我们生成UserModel
的实例对象了
使用Environment
对象,这个对象里面有很多获取值的方法,这种方法用的较少。
@Repository
public class UserModel {
//使用setter的方式注入Enviroment对象
private Environment environment;
@Autowired
public void setEnvironment(Environment environment) {
this.environment = environment;
}
//通过environment对象获取值
public String getUserNameByEnv(){
return environment.getProperty("database.username");
}
}
重点是这种方法,既灵活又迷惑。其思想是将配置文件中相关的一组配置映射为一个POJO(plain old java object),更准确的说是映射为一个JavaBean。然后我们就可以通过这个JavaBean来使用配置文件里的值了。
不同版本这个注解的使用方式有一些不同,本文使用的是SpringBoot2.4.5。
例如此例是一组database相关的配置,其下面还有一个子组server。
database.username=ss007
database.password=wb123
database.server.ip=192.168.1.1
database.server.port=8000
这里有几个注意点:
Java类字段命名不需要与配置文件完全一样,但也不能随意命名,要符合一定的规则:
例如配置文件中为:username, Java类自动名称可以为:UserName/Username/userName/username/User-Name/user-name
等等,但是在Java中一般使用小驼峰格式:userName
。
当配置文件中的属性结构存在层级时,就需要使用嵌套类。例如此处的server。
因为SpringBoot使用setter来将配置文件的值赋值到JavaBean里面的,所以不可省略,否则赋值将失败。
下面的代码为上面属性配置的隐射
public class DatabaseConfig { /** * 数据库用户名 */ private String userName; /** * 数据库密码 */ private String passWord; /** * 数据库服务器 */ private Server server; public void setUserName(String userName) { this.userName = userName; } public void setPassWord(String passWord) { this.passWord = passWord; } public void setServer(Server server) { this.server = server; } ...省略了getter public static class Server{ /** * 服务器IP */ private String ip; /** * 服务器端口号 */ private int port; public void setIp(String ip) { this.ip = ip; } public void setPort(int port) { this.port = port; } ...省略了getter } }
其中prefix为属性配置文件中那组配置的最外层,此处为database
。
完成以上三步后,我们需要让Spring感知到这个类,那样当我们使用的时候,它才能帮我们注入实例。
这里又存在3中方式:
第一种方式:使用@Configuration
注解标记你的配置类,此处为DatabaseConfig
。
第二种方式:使用@ConfigurationPropertiesScan()
注解标记你的程序启动类xxxApplication
,此处为SpringLearnApplication。
第三种方式:使用@EnableConfigurationProperties({你的配置类.class})
注解标记你的程序启动类xxxApplication
,此处为SpringLearnApplication。
三种方式使用任何一种都可,其中第二种方式最为便捷,相当于SpringBoot自动扫描那些使用@ConfigurationProperties
标记的类。
最后的样子为
@Configuration //当使用`@ConfigurationPropertiesScan()`或`@EnableConfigurationProperties({你的配置类.class})` 时,此注解可省略
@ConfigurationProperties(prefix="database")
public class DatabaseConfig {
...
}
当想要使用配置文件中的值时,注入DatabaseConfig
实例,然后使用其值即可。
三种方式中第三种应该是使用最多的,也最为复杂,你学会了吗?其功能远不止如此,我们下篇接着聊。
最后来个调查吧,你喜欢哪种格式的配置文件?properties 或者yml
文章最后有源码,觉得可以记得star。
GitHub源码: springboot-learn
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。