博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
002.SpringBoot入门篇:属性配置和使用
阅读量:4110 次
发布时间:2019-05-25

本文共 14181 字,大约阅读时间需要 47 分钟。

简介

在使用SpringBoot构建项目的过程中,简化了第三方插件与Spring整合步骤,省略了繁琐的XML配置内容,只需要在pom.xml文件中引入模块化的Starter POMs,其中各个模块都有自己的默认配置,所以如果不是特殊应用场景,就只需要在application.properties中完成一些属性配置就能开启各模块的应用。

如果需要修改自定义修改默认配置,spring boot 提供了很简便的方法,只需要在application.properties 中添加修改相应的配置。(spring boot启动的时候会读取application.properties这份默认配置)

注意:application.properties 是springboot默认的全局变量配置文件,默认位置是src/main/resources(如果不存在可以手动创建),SpingBoot的全局配置文件的作用是对一些默认配置的配置值进行修改。

修改默认配置

在application.properties文件中可以完成日志信息、数据库连接池、自定义变量等信息的配置。完整的配置参考官方地址:

tomcat端口

springboot开发web项目的时候,默认的端口号是8080,如果需要修改该端口号,需要在application.properties 添加以下记录:

#tomcat 端口号设置,重启后生效server.port=8888

重启之后可以看到端口号已经被修改:

2018-03-05 14:13:08.663  INFO 6672 --- [  restartedMain] o.s.b.w.embedded.tomcat.TomcatWebServer  : Tomcat started on port(s): 8888 (http) with context path ''

自定义属性和使用

在配置文件中定义

在配置文件application.properties增加如下信息:

#自定义属性信息并且在rest接口中返回使用com.sunld.applicationp.chapter=springboot自定义属性com.sunld.applicationp.course=《springboot系统化学习》#在配置文件中可以使用属性传递com.sunld.applicationp.learning=我们正在学习${
com.sunld.applicationp.course}中的${
com.sunld.applicationp.chapter}

测试用例

引用类-CourseLearningApplicationProperties

package com.sunld.conf;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;//可以通过@Value("${属性值}")获取配置文件中的属性@Componentpublic class CourseLearningApplicationProperties {
@Value("${com.sunld.applicationp.chapter}") private String chapter; @Value("${com.sunld.applicationp.course}") private String course; @Value("${com.sunld.applicationp.learning}") private String learning; public String getChapter() { return chapter; } public void setChapter(String chapter) { this.chapter = chapter; } public String getCourse() { return course; } public void setCourse(String course) { this.course = course; } public String getLearning() { return learning; } public void setLearning(String learning) { this.learning = learning; }}

测试类与结果

@Test    public void contextLoads() {    }    @Autowired    private CourseLearningApplicationProperties courseLearningApplicationProperties;    //测试自定义属性的获取    @Test    public void testCourseLearningApplicationProperties() {        System.out.println("章节:" + courseLearningApplicationProperties.getChapter());        System.out.println("课程:" + courseLearningApplicationProperties.getCourse());        System.out.println("学习:" + courseLearningApplicationProperties.getLearning());    }

结果输出-乱码:

章节:springboot自定义属性课程:《springbootç³»ç»ŸåŒ–å­¦ä¹ ã€‹学习:æˆ‘ä»¬æ­£åœ¨å­¦ä¹ ã€Šspringbootç³»ç»ŸåŒ–å­¦ä¹ ã€‹ä¸­çš„springboot自定义属性

乱码解决

原因分析

在配置文件application.properties中配置中文,在读取时会出现乱码,但是application.yml就显示正常。

原因:Springboot是以iso-8859的编码方式读取的application.properties配置文件。

解决方案

增加properties文件

新增配置文件

重新配置一个文件“myconfig.properties”,在加载的实例类中增加如下代码:

@PropertySource(value = "classpath:/myconfig.properties" ,encoding = "UTF-8")
引用类-CourseLearningMyConfig
测试和输出
@Autowired    private CourseLearningMyConfig courseLearningMyConfig;    //测试自定义属性的获取    @Test    public void testCourseLearningMyConfig() {        System.out.println("章节:" + courseLearningMyConfig.getChapter());        System.out.println("课程:" + courseLearningMyConfig.getCourse());        System.out.println("学习:" + courseLearningMyConfig.getLearning());    }

输出:

章节:springboot自定义属性-myconfig课程:《springboot系统化学习》-myconfig学习:我们正在学习《springboot系统化学习》-myconfig中的springboot自定义属性-myconfig

使用yml配置文件替换默认的properties配置文件

配置文件

使用application.yml替换application.properties文件

com: #自定义属性信息并且在rest接口中返回使用  sunld:    applicationp:       chapter: springboot自定义属性-yml      course: 《springboot系统化学习》-yml      #在配置文件中可以使用属性传递      learning: 我们正在学习${
com.sunld.applicationp.course}中的${
com.sunld.applicationp.chapter}
引用类-CourseLearningApplicationYml
测试与结果
@Autowired    private CourseLearningApplicationYml courseLearningApplicationYml;    //测试自定义属性的获取    @Test    public void testCourseLearningApplicationYml() {        System.out.println("章节:" + courseLearningApplicationYml.getChapter());        System.out.println("课程:" + courseLearningApplicationYml.getCourse());        System.out.println("学习:" + courseLearningApplicationYml.getLearning());    }

输出结果:

章节:springboot自定义属性-yml课程:《springboot系统化学习》-yml学习:我们正在学习《springboot系统化学习》-yml中的springboot自定义属性-yml

@ConfigurationProperties读取自定义属性

在pom文件增加依赖信息

org.springframework.boot
spring-boot-configuration-processor
true

增加解析配置文件的bean

参考代码如下

package com.sunld.conf;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.PropertySource;import org.springframework.stereotype.Component;//可以通过@Value("${属性值}")获取配置文件中的属性@Component@PropertySource(value = "classpath:/myconfig.properties" ,encoding = "UTF-8")//@ConfigurationProperties注解主要用来把properties配置文件转化为bean来使用的,//而@EnableConfigurationProperties注解的作用是@ConfigurationProperties注解生效。@ConfigurationProperties(prefix="com.sunld.application")public class CourseLearningMyConfigAuto {
private String chapter; private String course; private String learning; public String getChapter() { return chapter; } public void setChapter(String chapter) { this.chapter = chapter; } public String getCourse() { return course; } public void setCourse(String course) { this.course = course; } public String getLearning() { return learning; } public void setLearning(String learning) { this.learning = learning; }}

测试与结果

@Autowired    private CourseLearningMyConfigAuto courseLearningMyConfigAuto;    //测试自定义属性的获取    @Test    public void testCourseLearningMyConfigAuto() {        System.out.println("章节:" + courseLearningMyConfigAuto.getChapter());        System.out.println("课程:" + courseLearningMyConfigAuto.getCourse());        System.out.println("学习:" + courseLearningMyConfigAuto.getLearning());    }

结果:

章节:springboot自定义属性-myconfig课程:《springboot系统化学习》-myconfig学习:我们正在学习《springboot系统化学习》-myconfig中的springboot自定义属性-myconfig

注意:需要在应用类或者application类,加@EnableConfigurationProperties({BlogProperties.class})注解或者在bean中增加@Component。不能同时添加,会导致单例模式的失败。

发布到rest

controller

package com.sunld.controller;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;import com.sunld.conf.CourseLearningMyConfigAuto;//@RestController的意思就是controller里面的方法都以json格式输出,不用再写什么jackjson配置的了!@RestControllerpublic class PublishController {    @Autowired    private CourseLearningMyConfigAuto courseLearningMyConfigAuto;    @RequestMapping("/publishmyconfig")    public String publishMyConfig() {        System.out.println("章节:" + courseLearningMyConfigAuto.getChapter());        System.out.println("课程:" + courseLearningMyConfigAuto.getCourse());        System.out.println("学习:" + courseLearningMyConfigAuto.getLearning());        return courseLearningMyConfigAuto.toString();    }}

测试

package com.sunld;import org.junit.Before;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;import org.springframework.test.context.junit4.SpringRunner;import org.springframework.test.web.servlet.MockMvc;import org.springframework.test.web.servlet.request.MockMvcRequestBuilders;import org.springframework.test.web.servlet.result.MockMvcResultHandlers;import org.springframework.test.web.servlet.result.MockMvcResultMatchers;import org.springframework.test.web.servlet.setup.MockMvcBuilders;import com.sunld.controller.PublishController;@RunWith(SpringRunner.class)@SpringBootTest/** *  * @author sunliaodong * 使用mockmvc进行,利用MockMvcResultHandlers.print()打印出执行结果。 * 使用MockServletContext来构建一个空的WebApplicationContext, * 这样我们创建的HelloController就可以在@Before函数中创建并传递到MockMvcBuilders.standaloneSetup()函数中。 */public class PublishControllerTest {    @Autowired    private PublishController publishController;    @Before    public void setUp() throws Exception {        //使用new的方式会导致参数获取不到        //mvc = MockMvcBuilders.standaloneSetup(new PublishController()).build();        mvc = MockMvcBuilders.standaloneSetup(publishController).build();    }    @Test    public void getHello() throws Exception {    mvc.perform(MockMvcRequestBuilders.get("/publishmyconfig").accept(MediaType.APPLICATION_JSON))                .andExpect(MockMvcResultMatchers.status().isOk())                .andExpect(MockMvcResultMatchers.content().string("HelloWorld ...."))                .andDo(MockMvcResultHandlers.print())                .andReturn();    }}

随机数

在一些情况下,有些参数我们需要希望它不是一个固定的值,比如密钥、服务端口等。Spring Boot的属性配置文件中可以通过${random}来产生int值、long值或者string字符串,来支持属性的随机值。

增加配置文件random.properties

#随机数配置文件#获取随机字符串:${random.value}com.sunld.randomValue=${random.value}#获取随机int:${random.int}com.sunld.randomInt=${random.int}#获取10以内的随机数:${random.int(10)}com.sunld.ranomdInt10=${random.int(10)}#获取10-20的随机数:${random.int[10,20]}com.sunld.randomInt10_20=${random.int[10,20]}#获取随机long:${random.long}com.sunld.randomLong=${random.long}#获取随机uuid:${random.uuid}com.sunld.randomUuid=${random.uuid}

增加bean

package com.sunld.conf;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.context.annotation.PropertySource;import org.springframework.stereotype.Component;@PropertySource(value = {
"classpath:/random.properties"}, encoding="UTF-8")@Component@ConfigurationProperties(prefix = "com.sunld")public class RandomConfig {
//获取随机字符串:${random.value} private String randomValue; //获取随机int:${random.int} private String randomInt; //获取10以内的随机数:${random.int(10)} private String ranomdInt10; //获取10-20的随机数:${random.int[10,20]} private String randomInt10_20; //获取随机long:${random.long} private String randomLong; //获取随机uuid:${random.uuid} private String randomUuid; //get\set public String getRandomValue() { return randomValue; } public void setRandomValue(String randomValue) { this.randomValue = randomValue; } public String getRandomInt() { return randomInt; } public void setRandomInt(String randomInt) { this.randomInt = randomInt; } public String getRanomdInt10() { return ranomdInt10; } public void setRanomdInt10(String ranomdInt10) { this.ranomdInt10 = ranomdInt10; } public String getRandomInt10_20() { return randomInt10_20; } public void setRandomInt10_20(String randomInt10_20) { this.randomInt10_20 = randomInt10_20; } public String getRandomLong() { return randomLong; } public void setRandomLong(String randomLong) { this.randomLong = randomLong; } public String getRandomUuid() { return randomUuid; } public void setRandomUuid(String randomUuid) { this.randomUuid = randomUuid; } @Override public String toString() { return "RandomConfig [randomValue=" + randomValue + ", randomInt=" + randomInt + ", ranomdInt10=" + ranomdInt10 + ", randomInt10_20=" + randomInt10_20 + ", randomLong=" + randomLong + ", randomUuid=" + randomUuid + "]"; }}

增加测试类

package com.sunld;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;import com.sunld.conf.RandomConfig;@RunWith(SpringRunner.class)@SpringBootTestpublic class RandomConfigTest {    @Autowired    private RandomConfig randomConfig;    @Test    public void testGetRandomConfig() {        System.out.println(randomConfig);    }}

多环境配置

说明

实际开发中可能会存在不能的环境:开发环境、测试环境、生产环境,而且每个环境的配置文件(数据库配置、日志配置、端口配置等)可能不同,如果每次切换springboot的配置文件相对比较麻烦,还容易出现错误。在spring boot中提供了多环境配置,使得我们切换环境变得简便。

实现

创建文件

在application.properties同目录下根据实际情况创建相关文件:

application-dev.properties//开发环境application-test.properties//测试环境application-prod.properties//生产环境

生效

在application.properties添加如下信息:

#多环境配置spring.profiles.active=dev#引用测试的配置文件#spring.profiles.active=test#引用生产的配置文件#spring.profiles.active=prod

测试与总结

分别在application-dev.properties、application-test.properties、application-prod.properties中配置server.port为8888、8889、8890,然后使用如下命令测试端口使用情况。

命令 端口结果 执行文件
java -jar ***.jar 8888 application-dev.properties
java -jar ***.jar –spring.profiles.active=test 8889 application-test.properties
java -jar ***.jar –spring.profiles.active=prod 8890 application-prod.properties

通过测试总结如下:

  • application.properties中配置通用内容
  • 在application.properties中设置spring.profiles.active={profile},比如(spring.profiles.active=dev)开启开发环境为默认文件
  • application-{profile}.properties中配置各个环境不同的内容
  • 通过命令启用不同的配置
  • 文件格式要满足application-{profile}.properties

通过命令行方式修改参数

比如修改端口号,则可以执行以下命令:

java -jar ****.jar --server.port=9090

在命令号中连续输入两个减号+属性名=*,等同于在配置文件中直接配置。虽然通过命令行的方式配置参数比较便利,但是也带来了安全性问题,如果想禁用命令行输入,可以在启动类中增加如下代码:

springApplication.setAddCommandLineProperties(false);

完整代码参考如下:

package com.sunld;import org.springframework.boot.SpringApplication;import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplicationpublic class ApplicationdemoApplication {
public static void main(String[] args) {// SpringApplication.run(ApplicationdemoApplication.class, args); /** * 禁用命令行输入参数 */ SpringApplication springApplication = new SpringApplication(ApplicationdemoApplication.class); springApplication.setAddCommandLineProperties(false); springApplication.run(args); }}

总结

配置方式和优先级

这些方式优先级如下:

a. 命令行参数
b. 来自java:comp/env的JNDI属性
c. Java系统属性(System.getProperties())
d. 操作系统环境变量
e. RandomValuePropertySource配置的random.*属性值
f. jar外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
g. jar内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
h. jar外部的application.properties或application.yml(不带spring.profile)配置文件
i. jar内部的application.properties或application.yml(不带spring.profile)配置文件
j. @Configuration注解类上的@PropertySource
k. 通过SpringApplication.setDefaultProperties指定的默认属性

参考地址

代码地址

转载地址:http://nfasi.baihongyu.com/

你可能感兴趣的文章
“Maven官方用户入门指南”翻译之三
查看>>
“Maven官方用户入门指南”翻译之四
查看>>
“Maven官方用户入门指南”翻译之五
查看>>
“Maven官方用户入门指南”翻译之六
查看>>
“Maven官方用户入门指南”翻译之七
查看>>
Maven官方用户入门指南”翻译之八(完)
查看>>
Hadoop之MultipleOutputs
查看>>
hadoopJob执行shell脚本
查看>>
hadoop集群直接数据拷贝
查看>>
java读取jar中的资源文件
查看>>
生成shell脚本删除hadoop中所有Pending的Job
查看>>
[综合]Apache Hadoop 2.2.0概要[翻译]
查看>>
[综合]Apache Hadoop 2.2.0单节点集群安装[翻译]
查看>>
[综合]Apache Hadoop 2.2.0集群安装(1)[翻译]
查看>>
[综合]Apache Hadoop 2.2.0集群安装(2)[翻译]
查看>>
Hadoop对输入路径的过滤问题解决方式
查看>>
[综合]Apache Hadoop 2.2.0命令行参考手册[翻译]
查看>>
shell后台程序运行方式概述
查看>>
[综合]Apache Hadoop 2.2.0文件系统shell(一)[翻译]
查看>>
[综合]Apache Hadoop 2.2.0文件系统shell(二)[翻译]
查看>>