1.SpringBoot配置文件

SpringBoot使用一个以application命名的配置文件作为默认的全局配置文件。支持properties后缀结尾的配置文件或者以yml/yaml后缀结尾的YAML的文件配置。

以设置应用端口为例

properties文件示例(application.properties):

server.port=80

YAML文件示例(application.yml):

server:

port: 80

在properties和yml/yaml配置文件同时存在的情况下, 在同一目录下,properties配置优先级 > YAML(YML)配置优先级

2.配置文件目录

SpringBoot配置文件可以放置在多种路径下,不同路径下的配置优先级有所不同。

可放置目录(优先级从高到低)

./config/ (当前项目路径config目录下);

./ (当前项目路径下);

classpath:/config/ (类路径config目录下);

classpath:/ (类路径config下).

优先级由高到底,高优先级的配置会覆盖低优先级的配置;

SpringBoot会从这四个位置全部加载配置文件并互补配置;

我们可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录:

private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";

接着getSearchLocations方法中去逗号解析成Set,其中内部类Loader负责这一配置文件的加载过程,

包括加载profile指定环境的配置,以application+’-’+name格式的拼接加载。

多种目录配置同时存在情况

接下来还是以端口配置为例

在resources/目录下配置文件设置端口为8888;

在resources/config目录下配置文件设置端口为9999;

在项目路径下配置文件设置端口为6666;

在项目路径config目录下配置文件设置端口为7777;

]

最终运行结果:

Tomcat started on port(s): 7777 (http) with context path '/beedo'

Started BeedoApplication in 4.544 seconds (JVM running for 5.335)

通过控制变量法得以论证

其优先级由高到底,高优先级的配置会覆盖低优先级的配置

3.自定义配置属性

SpringBoot提供了许多的配置,但通常情况我们需要自定义自己的配置应用自己的系统中,如你需要配置一个默认的用户名密码做为系统的登录用。

首先创建一个实体类,作为配置注入用,并使用@ConfigurationProperties注解进行批量注入, 也可以使用Spring底层注解@Value("${user.username}")的方式一个一个注入达到同意的效果

@Component

@ConfigurationProperties(prefix = "user")

public class Login{

private String username;

private String password;

...

}

或者@Value写法

@Component

public class Login{

private String username;

private String password;

...

}

配置文件写法

# yml文件写法

user:

username: admin

password: 123

# properties写法

login.username=admin

login.password=123

编写一个junit测试用例,看看配置的值是否正常注入:

@RunWith(SpringRunner.class)

@SpringBootTest

public class DeployApplicationTests {

@Autowired

private Login login;

@Test

public void contextLoads() {

System.out.println(login);

}

}

从输出结果上看,值已正常注入

Login{username=‘admin’, password=‘123’}

@ConfigurationProperties与@Value两种注解对比

比较项

@ConfigurationProperties

@Value

全量注入

支持

不支持

松散绑定(Relaxed Binding)

支持

不支持

SpEL

不支持

支持

JSR303

支持

不支持

松散绑定:驼峰命名(userName)、横干拼接(user-name)、下划线(user_name)之间可以互相识别绑定称为做松散绑定

JSR303:通过@Email,@Nullable,@Digits 等等注解进行邮箱、判空、数字格式等等数据的校验,更多相关内容请参考IBM的中文文档:https://www.ibm.com/developerworks/cn/java/j-lo-jsr303/index.html

@ConfigurationProperties通常用于将配置全量注入某个类中;

@Value通常用于注入某一些特定配置值中;

使用@ConfigurationProperties方式可以进行配置文件与实体字段的自动映射,但需要字段必须提供set方法才可以,而使用@Value注解修饰的字段不需要提供set方法

自定义配置提示

在编写配置时,你会发现自定义配置没有提示,让你在使用自定义配置时变的很麻烦,其实SpringBoot早已为我们准备好了提示的需要,只需要用引入相关依赖即可有提示。

在没有加入依赖时idea会有如下提示:

添加依赖,该idea提示便消失,编写自定义配置时也有相应提示:

org.springframework.boot

spring-boot-configuration-processor

true

需要运行一下

4.指定配置文件

通常情况下我们将配置配置在application开头的主配置文件中,这样随着项目的增大配置项的增多会使文件变得非常臃肿,其实SpringBoot早已考虑到了该问题,SpringBoot提供了@PropertySource和@ImportResource两个注解用于加载外部配置文件使用。

@PropertySource通常用于属性加载配置文件,注意@PropertySource注解不支持加载yaml文件,支持properties文件。

@ImportResource通常用于加载Spring的xml配置文件

@PropertySource使用

装配properties配置文件

在sources/config下创建一个yaml文件命名为user.properties内容与上方user的配置一样

Login类可如下写法

@PropertySource(value = {"classpath:config/user.properties"})

@Component

@ConfigurationProperties(prefix = "user")

public class Login{

private String username;

private String password;

...

}

运行一下,同样能达到加载配置效果

同时加载多个配置问题

细心的你,会发现@PropertySource注解中属性value为一个数组,如果同时加载多个配置文件,并且不同配置文件中对同一个属性设置了不同的值,那么Spring会识别哪一个呢?

带着疑问,我们可以通过控制变量法进行测试,具体过程再在赘述。

@PropertySource(value = {"classpath:config/user1.properties","classpath:config/user2.properties"})

结论:Spring加载顺序为从左到右顺序加载,后加载的会覆盖先加载的属性值。

装配yaml配置文件

如果你有强迫症,一定想加载yaml配置文件,那么可以通过PropertySourcesPlaceholderConfigurer类来加载yaml文件,将原来的user.properties改成user.yaml,Bean配置类中加入如下代码,Login配置类和一开始的方式一致。

@Bean

public static PropertySourcesPlaceholderConfigurer loadProperties() {

PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();

YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();

//yaml.setResources(new FileSystemResource("classpath:config/user.yml"));//File路径引入

yaml.setResources(new ClassPathResource("config/user.yml"));//class路径引入

configurer.setProperties(yaml.getObject());

return configurer;

}

运行一下,仍然可以能达到加载配置效果的

@ImportResource使用

SpringBoot提出零xml的配置,因此SpringBoot默认情况下时不会识别项目中Spring的xml配置文件。为了能够加载xml的配置文件,SpringBoot提供了@ImportResource注解该注解可以加载Spring的xml配置文件,通常加于启动类上。

@ImportResource(value = {"classpath:/beans.xml"})

@SpringBootApplication(scanBasePackages = {"team.seagull.client"})

public class DeployApplication {

public static void main(String[] args) {

SpringApplication.run(DeployApplication.class, args);

}

}

其他问题

idea使用.properties文件出现中文乱码问题?

idea对.properties默认编码为GBK,通常我们项目为UTF-8编码,这样程序在读取时就会出现乱码问题;

解决方法:idea 中 打开如下选项File->Sttings->Editor->FileEncodings

将GBK修改为UTF-8并勾选

Transparent native-to ascill conversion(在运行的时候转换成ascii码)

站在巨人的肩膀上摘苹果:

springboot加载外部xml_SpringBoot读取外部配置文件的方法相关推荐

  1. 服务器jar包配置文件,spring boot加载第三方jar包的配置文件的方法

    前言 今天收到一封邮件,大概内容如下:spring boot鼓励去配置化,那么怎么将第三方jar包中的xml去配置化了? 下面,我们就以Quartz定时任务为例,单独对这个问题来进行说明,如何实现去配 ...

  2. 提升网页加载速度—预加载VS预读取

    预加载器(Pre-loader)可以说是提高浏览器性能最重要的举措.Mozilla 官方发布数据,通过预加载器技术网页的加载性能提升了19%,Chrome测试了 Alexa 排名前2000名网站,性能 ...

  3. springboot 加载一个properties文件转换为对象、List和Map数据结构

    springboot 加载一个properties文件转换为对象.List和Map数据结构 一.springboot 加载一个properties文件转换为对象 1.1.配置文件-blog.prope ...

  4. SpringBoot 加载不出来application.yml文件

    摘要 记录一次SpringBoot加载不出来application.yml文件的问题解决过程 问题 配置了application.yml文件,但是映射到properties bean的时候失败 @Co ...

  5. springboot 加载配置信息(静态)

    springboot 加载配置信息(静态) 举例:动态设置验证码过期时间 application-uat.properties配置(文件路径:/src/main/resources/applicati ...

  6. SpringBoot加载spring.factories的价值

    SpringBoot加载spring.factories的价值 在springboot的各个依赖包下,我们经常看到META-INF/spring.factories这个文件.spring.factor ...

  7. JS动态加载脚本及对动态脚本内方法的调用

    JS动态加载脚本及对动态脚本内方法的调用 摘要 JS动态加载脚本及对动态脚本内方法的调用 JS 动态 添加脚本 按需加载 首先我们需要一个被加载的js文件,我在一个固定文件夹下创建了一个package ...

  8. java中udi_Java读取.properties配置文件的方法

    java中的properties文件是一种配置文件,主要用于表达配置信息,文件类型为*.properties,格式为文本文件,文件的内容是格式是 "键=值"的格式,在propert ...

  9. 加快网页加载速度的五个有效的方法

    加快网页加载速度的五个有效的方法 Filed under: 未分类 | Posted on  五月 1st, 2010 by 林涛 网页尽可能的快速加载对网站非常重要:用户希望快速的查看他们想要看的页 ...

最新文章

  1. Xshell5中常用linux服务器命令集合
  2. Maven项目下HttpServletRequest 或 HttpServletResponse需引用的依赖包
  3. 自签名证书说明——自签名证书的Issuer和Subject是一样的。不安全的原因是:没有得到专业SSL证书颁发的机构的技术支持?比如使用不安全的1024位非对称密钥对,有效期设置很长等...
  4. Python 基础语法(四)
  5. 数学建模学习笔记——时间序列分析
  6. Java throws子句
  7. python语言input和if else的嵌套使用_Linux平台下Python if、if..else、if..elif..else、嵌套if语句...
  8. 0001-Two Sum(两数之和)
  9. 服务端架构中的“网关服务器”
  10. oracle11g session,Oracle11g中Killsession心得
  11. php重定义地址栏url,thinkphp框架实现路由重定义简化url访问地址的方法分析
  12. 网络流24题——魔术球问题(有向无环图最小路径覆盖)
  13. oracle导入字符集,Oracle导入字符集问题
  14. 数据分析系统DIY1/3:CentOS7+MariaDB安装纪实
  15. linux rsh(remote shell) 命令详解
  16. AI创作现状与未来发展浅析
  17. SEO与SEM有什么区别?
  18. 操作系统名词中英文对照(一)
  19. 【听】蔡康永的说话之道,说话的技巧方法论
  20. python渲染光线_Python光线追踪

热门文章

  1. textaligncenter仍然不居中_戊唑醇和己唑醇都是杀菌剂,有啥不同?真正懂的人不多...
  2. 加速安装LibcSeacher
  3. CTF-杂项与密码学之工具使用汇总(三)
  4. python:关于py文件之间相互import的问题
  5. python 鸭子类型及三大特性
  6. 微信小程序直播自己的服务器,使用微信小程序和腾讯云实现直播功能
  7. C语言中流程图的主要作用是,C语言 三大流程控制
  8. C语言 socket listen()函数(socket()函数创建的socket(套接字描述符)默认是一个主动类型的,listen函数将socket变为被动类型的,等待客户的连接请求)
  9. C语言linux getopt_long()函数(命令行解析)(getopt、getopt_long_only)(短选项 -,长选项 --)(option结构体)(optind、optarg变量)
  10. pycharm提示:Class names should use CamelCase convention(类名命名应遵守驼峰命名约定)