SpringBoot入门之属性配置

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/H_233/article/details/87932998

上一篇讲到SpringBoot的项目搭建与启动,其中启动默认是直接启动在8080端口上的。当然,我们可以通过配置文件去配置。

SpringBoot帮默认的是.properties类型的配置文件,在其中配置信息可以这样配置(port端口,context-path为项目路径,‘localhost:8080/girl/...’去访问)

或者是.yml类型的配置文件配置,这里推荐SpringBoot配置文件采用.yml,很明显这种类型的配置是相对简洁的,IDEA也是很好地支持了yml的语法。

 如上验证,'localhost:8080/hello'无法访问,'localhost:8080/girl/hello'可访问。


当然我们还可以在配置文件中配置一些其他信息,然后在代码中去获取到这些配置信息也是可以的(之前spring我们是在一个.properties中去配置一些参数,然后在application.xml中扫描.properties文件,然后启动web.xml的时候再去加载application.xml文件,然后我们代码中就可以获取到配置的参数了;而SpringBoot明显就简洁很多)

我们直接在.yml文件中配置:

然后代码中通过@Value注解去获取就可以了。


但是有一个问题,就是如果有100个配置参数,我们代码中难道还要100次@Value注解去获取吗?显然这很不好,所以SpringBoot为我们提供了另一种解决方式:就是采用配置文件映射的方案,我们为我们配置的参数分类,设置层级(等同于.properties文件中girl.cupSize=B),如下图所示:

然后我们new 一个class,通过@ConfigurProperties注解去映射前缀为‘girl’的配置参数,SpringBoot会自动为我们将配置文件中‘girl’相关的参数映射到该pojo中。为了后续依赖注入使用,我们为该class添加@Component注解

然后我们直接注入该配置类即可,

注意:需要将我们之前写的@Value获取的参数去掉,也就是配置文件中没有的参数,@Value注解再去获取是有问题的,因为@Value注解在去解析的时候,如果没有该参数,是会报错的,错误信息如下:

Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'cupSize' in value "${cupSize}"


我们在实际开发中,是有这种情况的,就是我们经常会分环境,比如生产环境(product)、测试环境(test)和开发环境(dev)等。我们可能某些参数在不同的环境是配置不同的值,那么我们不可能切换环境的时候还要去改配置文件中这些参数的值,这样很麻烦,也不利于维护。SpringBoot提供了解决方式:通过spring.profiles.active去控制当前生效的是哪一种配置参数,如下:

我们新增一个开发环境配置文件:

在新增一个生产环境配置文件:

我们在主配置文件中,去配置当前生效的配置信息为哪一个,

这样就避免了我们在切换环境时,改动参数值。

但是这样还是有一个问题就是,我们还是需要该active生效的是哪一个,比如切换到生产我们要改成prod,本地开发改成dev,在公司开发的流程也应该是这样的,我们在开发完后,active配的是dev,然后我们将代码提到版本控制上(git或svn),然后测试完发版上线的时候,我们肯定是要切到prod上的,这是难道我们还要去把代码中配置文件改一下然后再提上去吗?很显然,这样很麻烦,所以我们可以下面这种方式:通过在上一篇SpringBoot入门之项目搭建与运行中讲到的jar运行项目的方式,可以避免修改配置文件的问题。

我们先将项目打包(注意,我这里是用的PowerShell ,在该窗口下,执行maven命令带参数的需要’单引号’包起来才可以,否则会报错)

然后我们运行jar,后跟‘--spring.profiles.active=dev’即可。

我们可以测试下,先IDEA中application的main启动dev,然后jar包方式启动prod,发现8080和8081都是可以访问到。(可以理解二者是在两个不同的容器中运行的,main方法启动一个,jar包自带一个)

猜你喜欢

转载自blog.csdn.net/H_233/article/details/87932998
今日推荐