SpringBoot 系列(5)- 自定义配置
springboot 的配置
之前介绍过 springboot 相比 spring 来讲需要配置的地方少了很多。 使用 spring 就像是自己组装电脑,需要自己选择购买 CPU,内存,显卡,硬盘等,而使用 springboot 就像是买品牌电脑,已经把合适的配置选择好了,直接用就可以了。 不过 springboot 不只是帮你选择了配置,它还允许你在现有配置上进行DIY,就像选择指定型号的硬件一样,让你参与到配置的过程中。 一般情况下,使用默认的配置绰绰有余,但是在某些情况下, 默认配置无法满足你的要求,在这种情况下你就需要自定义配置了。
通过配置文件调整
如果只是调整一些细节,比如数据源的类型或日志级别,或端口号,那么只需要在配置文件中进行设置就可以了。 SpringBoot 本身支持很多种属性的调整,所以如果需要某些功能的改变时可以先查询一下是否有相关的配置属性。、 springboot 设置属性有多种方式,可以写在文件中,也可以配置到环境变量中 以下是一个配置文件(application.yml)中的一部分,其中调整了端口号和数据源的部分属性
springboot 属性优先级
springboot 可以从以下位置获取属性,这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级的相同属性。例如,命令行参数会覆盖其他属性源里的属性。
命令行参数
java:comp/env里的JNDI属性
JVM系统属性
操作系统环境变量
随机生成的带random.*前缀的属性(在设置其他属性时,可以引用它们,比如${random.long})
应用程序以外的application.properties或者appliaction.yml文件
打包在应用程序内的application.properties或者appliaction.yml文件
通过@PropertySource标注的属性源
默认属性
application 属性文件存储位置
application 属性文件也有四个位置可以存储,按以下优先级排序,位置高的将覆盖位置
当前项目目录下的一个/config子目录,也就是在相对于应用程序运行目录的/config子目录里
当前应用程序运行目录
项目的resources 即一个classpath下的/config包
项目的resources 即classpath根路径(root)
ps:在同一优先级位置同时有application.properties和application.yml,那么application. yml里的属性会覆盖application.properties里的属性
自定义 bean 覆盖配置
如果默认的实现不满足需求,可以自定义配置覆盖默认的配置,比如对于前后端分离在调试时经常发生的跨域问题,就可以使用自定义的配置实现。 每个应用是否需要跨域,可以访问哪些路径等等这都是不一样的,所以使用默认配置是不合适的,以下就是一个跨域配置的例子。
不同的环境激活不同的配置
应用程序可能需要部署到不同的环境中,比如开发、测试、生产等,在不同的环境一些配置细节通常会有所不同。 比如,数据库连接在开发环境下和测试环境下就会不一样,在生产环境下又不一样;日志的打印级别也不一样。 使用 springframework 的 profile 条件化配置,可以选择运行特定的配置。 比如,在上一个跨域的配置中,我们可以设置值在sit环境才启用跨域设置。
使用的时候设置 spring.profiles.active 属性就能激活 Profile,任意设置配置属性的方式都能用于设置这个值。 比如 application.properties 中设置 spring.profiles.active=production
版权声明: 本文为 InfoQ 作者【引花眠】的原创文章。
原文链接:【http://xie.infoq.cn/article/12e7eb908980c51bb9e8c97d0】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论