首页 > 其他分享 >Spring读取配置文件

Spring读取配置文件

时间:2022-10-09 12:00:50浏览次数:54  
标签:读取 zone Spring app Value String host 配置文件


一、Resource

在Java程序中,我们经常会读取配置文件、资源文件等。使用Spring容器时,我们也可以把“文件”注入进来,方便程序读取。

Spring提供了一个​​org.springframework.core.io.Resource​​​(注意不是​​javax.annotation.Resource​​​),它可以像​​String​​​、​​int​​​一样使用​​@Value​​注入:

@Component
public class AppService {
@Value("classpath:/logo.txt")
private Resource resource;

private String logo;

@PostConstruct
public void init() throws IOException {
try (var reader = new BufferedReader(
new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8))) {
this.logo = reader.lines().collect(Collectors.joining("\n"));
}
}
}

注入​​Resource​​​最常用的方式是通过classpath,使用Maven的标准目录结构,所有资源文件放入​​src/main/resources​​​即可,即类似​​classpath:/logo.txt​​​表示在classpath中搜索​​logo.txt​​​文件,然后,我们直接调用​​Resource.getInputStream()​​就可以获取到输入流,避免了自己搜索文件的代码。

也可以直接指定文件的路径,例如:

@Value("file:/path/to/logo.txt")
private Resource resource;

在开发应用程序时,经常需要读取配置文件。最常用的配置方法是以​​key=value​​​的形式写在​​.properties​​​文件中。​​Resource​​​来读取位于classpath下的一个​​app.properties​​文件。但是,这样仍然比较繁琐

二、@PropertySource&@Value

Spring容器还提供了一个更简单的​​@PropertySource​​​来自动读取指定的配置文件。我们只需要在​​@Configuration​​配置类上再添加一个注解:

@Configuration
@ComponentScan
@PropertySource("app.properties") // 表示读取classpath的app.properties
public class AppConfig {
@Value("${app.zone:Z}")
String zoneId;

@Bean
ZoneId createZoneId() {
return ZoneId.of(zoneId);
}
}

Spring容器看到​​@PropertySource("app.properties")​​​注解后,自动读取这个配置文件,然后,我们使用​​@Value​​正常注入:

@Value("${app.zone:Z}")
String zoneId;

注意注入的字符串语法,它的格式如下:

  • ​"${app.zone}"​​​表示读取key为​​app.zone​​的value,如果key不存在,启动将报错;
  • ​"${app.zone:Z}"​​​表示读取key为​​app.zone​​​的value,但如果key不存在,就使用默认值​​Z​​。

这样一来,我们就可以根据​​app.zone​​​的配置来创建​​ZoneId​​。

还可以把注入的注解写到方法参数中:

@Bean
ZoneId createZoneId(@Value("${app.zone:Z}") String zoneId) {
return ZoneId.of(zoneId);
}

可见,先使用​​@PropertySource​​​读取配置文件,然后通过​​@Value​​​以​​${key:defaultValue}​​的形式注入,可以极大地简化读取配置的麻烦。

另一种注入配置的方式是先通过一个简单的JavaBean持有所有的配置,例如,一个​​SmtpConfig​​:

@Component
public class SmtpConfig {
@Value("${smtp.host}")
private String host;

@Value("${smtp.port:25}")
private int port;

public String getHost() {
return host;
}

public int getPort() {
return port;
}
}

然后,在需要读取的地方,使用​​#{smtpConfig.host}​​注入:

@Component
public class MailService {
@Value("#{smtpConfig.host}")
private String smtpHost;

@Value("#{smtpConfig.port}")
private int smtpPort;
}

注意观察​​#{}​​​这种注入语法,它和​​${key}​​​不同的是,​​#{}​​​表示从JavaBean读取属性。​​"#{smtpConfig.host}"​​​的意思是,从名称为​​smtpConfig​​​的Bean读取​​host​​​属性,即调用​​getHost()​​​方法。一个Class名为​​SmtpConfig​​​的Bean,它在Spring容器中的默认名称就是​​smtpConfig​​​,除非用​​@Qualifier​​指定了名称。

使用一个独立的JavaBean持有所有属性,然后在其他Bean中以​​#{bean.property}​​​注入的好处是,多个Bean都可以引用同一个Bean的某个属性。例如,如果​​SmtpConfig​​​决定从数据库中读取相关配置项,那么​​MailService​​​注入的​​@Value("#{smtpConfig.host}")​​仍然可以不修改正常运行。

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

<context:component-scan base-package="org.example.demo1"/>
<!--方法1:使用property-placeholder加载properties文件-->
<context:property-placeholder location="stu.properties"/>
<!-- 方法2:加载属性文件 -->
<bean id="propertyPlaceholderConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="order" value="1"/>
<!-- 忽略不能读取的属性 -->
<property name="ignoreUnresolvablePlaceholders" value="true"/>
<property name="locations">
<list>
<value>classpath:stu.properties</value>
</list>
</property>
</bean>

</beans>


标签:读取,zone,Spring,app,Value,String,host,配置文件
From: https://blog.51cto.com/u_11334685/5740090

相关文章

  • Springboot自动配置原理
    一个boot项目启动类有个@SpringBootApplication注解,查看此注解主要包括@SpringBootConfiguration、@EnableAutoConfiguration、@ComponentScan三个注解@SpringBootConfigura......
  • Java中如何使用Scanner类读取.txt文件呢?
    转自:http://www.java265.com/JavaJingYan/202111/16359892761682.html 文件是日常开发中,使用最多的一种东西,在操作系统中,万物都以文件的形式存在,如:磁盘,网络,内存都都以......
  • springCloud 中 当需要有生产者集群的时候几个关键点
     前提条件是:使用Eureka 作为注册中心,并且搭建好了 Euraka 集群。当我们需要使用 多个生产者来形成集群来达到高可用。 生产者就是服务提供者,消费者就是服务调用者。 ......
  • springcloud- Eureka 单机版注册中心
    eureka 使用过程 简单的梳理:服务客户三步走,pom,yml,主启动。 首先搭建 eureka 注册中心服务 创建一个 maven 项目 ##引入相关的pom<?xmlversion="1.0"encoding......
  • 说说 Spring 定时任务如何大规模企业级运用
    作者:姚辉(千习)Spring定时任务简介定时任务是业务应用开发中非常普遍存在的场景(如:每分钟扫描超时支付的订单,每小时清理一次数据库历史数据,每天统计前一天的数据并生成报......
  • 把你的springboot启动图(banner)设置成圣嘉然!
    在resource文件夹下面新建一个banner.txt的文件!然后插入如下的文字!点击查看代码...,]]]/@@@@@O]]]]]`........,]]]..............
  • springCloud - 选择最合适版本问题
     尚硅谷的第一季 springcloud 学完,也忘完了。于是今天阳哥出了第二季,我就跟着再学一遍,这次要做好笔记。 ## 问题概要这篇主要解决的是 springcloud 选择版本的问题,......
  • springCloud- 搭建项目全部详细过程(创建一个父工程)
     这篇文章里边会有 IDEA 相关本地环境的配置,比如编码格式,等等。 另外这篇文章会详细的记录整个创建的过程,我都会有截图 前提条件需要:maven环境(配置过国内的镜像), idea......
  • JAVA Spring学习笔记------MVC
    SpingMVC首先我没接触过页面开发这里只简单的介绍如何通过spring利用注解的形式搭建一个简单的页面首先我们配置pom文件先加入两个依赖<dependency><gro......
  • springCloud- 升级惨案
     基本上 之前的那套 springcloud 官网都停止更新了。然后有新技术的来替代,这篇文章来记录一下技术选型的问题。我觉得 springcloud 体系还是直接选用 springcloud a......