
1.8 【实例】通过单配置文件让工程适应多应用场景
1.8.1 实例背景
在生产中通常会运行UAT(用户单元测试环境)或SIT(用户验收测试集成环境)等多种环境,可能会造成频繁修改application资源配置文件的情况。
本实例在boot_01工程的基础上,基于Profile方式在一个资源配置文件下同时设置多个环境参数,每个环境所使用的参数不同。Spring Boot微服务在启动时根据所输命令去适应应用场景。
1.8.2 更改application.yml文件
更改application.yml文件代码如下。

1.8.3 更改启动类
之前工程的启动类一直用SpringApplication.run(ApplicationMain.class,args)启动,而下述代码的启动类使用了SpringApplicationBuilder(),两者在运行上并无任何区别,只是SpringApplication.run()不会额外设置profile文件等,大多采用默认状态。
更改Spring Boot的启动类ApplicationMain.java代码如下。

SpringApplication.run(.class,args)和SpringApplicationBuilder().run(.class)在底层上都会进入SpringApplication.java类的SpringApplication(ResourceLoader resourceLoader,Class<?>...sources)函数,加载配置文件相关信息,其底层代码如下。

SpringApplication构造函数相当于创建了一个新的SpringApplication实例,并且将加载应用程序上下文。之前做的更改实例配置等相关方式最终也是为了更改SpringApplication构造函数。该函数详解如下。
(1)ResourceLoader参数:需要加载的资源与相关配置信息。
(2)primarySources参数:额外引入的Bean资源。
(3)deduceWebApplicationType()函数:返回该Web程序的枚举类型,在Spring Boot中应用程序分为以下3种类型。
● 不需要在Web容器下运行,也是普通Java工程:WebApplicationType.NONE。
● 基于Servlet的Web应用:WebApplicationType.SERVLET。
● 响应式reactive Web应用:WebApplicationType.REACTIVE。响应式编程是Spring5推出的新特性,Spring单独创建了一个Spring WebFlux框架,即响应式Web编程框架,其底层是由Netty框架提供的异步支持;它用少量的线程处理更高的并发,在支持异步方式的同时也支持同步方式,类似于WebSocket式的客户端与服务器双向监听。

图1-17
(4)ApplicationListener监听接口:属于Spring Boot的核心组件之一,由多种方式实现,它基于观察者设计模式设计监听接口,用于应用程序的各种事件监听。
1.8.4 输入启动参数
在ApplicationMain.java类中右键单击工程,如图1-17所示,选择Run As→Run Configurations配置工程启动命令。因为在配置文件中编写了UAT和SIT两套资源环境,所以在Eclipse里需更改Run Configurations启动配置参数,否则Spring Boot无法判断用哪种方式启动。
Run Configurations对话框如图1-18所示,Run Configurations相当于java-jar命令行启动时后续输入的参数。在Program arguments文本框中书写UAT或SIT,便是将参数传入main方法的String[] args入参中,根据程序处理将工程配置成UAT或SIT相应的环境。若要配置JVM内存等相关信息,则在VM arguments文本框中书写。

图1-18
此时运行项目会通过9998端口进行启动,实现了通过单个配置文件让程序适应多个环境的目的。
1.8.5 运行结果
Spring Boot已经用9998端口启动,并且通过/getName接口获取了book下的another参数,运行结果如图1-19所示。

图1-19
1.8.6 实例易错点
“---”(三个减号)用来分割多套配置信息。前面不可加空格,否则会报错,报错信息如下。

(1)spring下profiles后的Value值可自定义,即自定义某一区域内配置信息所起的名字,代码如下。

(2)spring下profiles放置的位置只要在此区域内即可。