广告
返回顶部
首页 > 资讯 > 后端开发 > Python >spring 和 spring boot 中的属性配置方式
  • 811
分享到

spring 和 spring boot 中的属性配置方式

2024-04-02 19:04:59 811人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录在xml中注册属性文件多个通过java注解方式注册属性文件使用及注入属性属性搜索优先级Spring Boot 属性加载application.properties – 缺省属性文

本文我们介绍如何在spring中配置和应用属性——通过xml的 或java Configuration 的@PropertySource。

在Spring 3.1之前,将新的属性文件添加到Spring中及使用属性值并不是那么灵活和健壮。从Spring 3.1开始,新的Environment 和 PropertySource 抽象已经简化整个过程。

在xml中注册属性文件

通过在xml增加


<?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-4.2.xsd
      http://www.springframework.org/schema/context 
      http://www.springframework.org/schema/context/spring-context-4.2.xsd">
      <context:property-placeholder location="classpath:foo.properties" />
</beans>

foo.properties文件可以放在/src/main/resources文件夹中,即运行时类路径。

多个

如果在Spring上下文中出现了多个 元素,那么应该遵循以下几个最佳实践:

  • 需指定order属性来确定spring处理顺序
  • 需要引用其他原始属性元素应该增加ignore-unresolvable= “true”,使解析机制先不抛出异常的情况下继续加载其他配置。

通过java注解方式注册属性文件

Spring 3.1 引入新的 @PropertySource 注解,可以方便地给spring environment中添加property source。该注解与基于Java Configuration 方式配置的@Configuration注解一起使用:


@Configuration
@PropertySource("classpath:foo.properties")
public class PropertiesWithJavaConfig {
    //...
}

另一个非常有用的注册方式为使用占位符方式实现运行时动态选择属性文件,示例如下:


@PropertySource({ 
  "classpath:persistence-${envTarget:Mysql}.properties"
})
…

使用及注入属性

直接通过 @Value 注解注入属性:


@Value( "${jdbc.url}" )
private String jdbcUrl;

也可以指定缺省值:


@Value( "${jdbc.url:aDefaultUrl}" )
private String jdbcUrl;

在 Spring XML configuration使用属性:


<bean id="dataSource">
  <property name="url" value="${jdbc.url}" />
</bean>

旧的 PropertyPlaceholderConfigurer 和新的 PropertySourcesPlaceholderConfigurer(Spring 3.1 中引入)都可以解析xml bean定义和@value注解中的 ${…} 占位符 。

最后,使用新的Environment api可以获取属性值:


@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));

特别需要注意的是,使用不会暴露属性给 Spring Environment,这意味这下面代码会返回null:


env.getProperty("key.something")

属性搜索优先级

spring4中,默认local properties文件最后加载,environment Properties和system Properties之后。local properties是通过PropertiesLoaderSupport 类的API方法 (setProperties, setLocation, etc)手工或编程方式配置的。

这种机制可以通过设置PropertySourcesPlaceholderConfigurer类的localOverride 属性进行修改,值为true允许local properties覆盖spring系统加载的。

spring3.0之前,PropertyPlaceholderConfigurer 类尝试在手工定义源和System Properties两个地方查找,查找顺序也可以通过设置systemPropertiesMode属性进行配置:

  • never – 总不检查 system properties
  • fallback (default) – 如果指定的properties files查找不到,则检查 system properties
  • override – 先检查system properties,然后再尝试指定的properties files。这允许system properties覆盖任何其他属性源。

最后需注意,如果在两个或多个通过@PropertySource定义了属性,那么最后一个定义优先级最高并覆盖以前的定义。这使得准确的属性值难以预测,所以如果覆盖不满足需求,那么可以重写PropertySource API。

spring boot 属性加载

在我们进入更高级的属性配置之前,让我们先看看Spring Boot中属性加载的新特性。

总的来说与标准Spring相比,这种新支持的配置更少,当然这是Spring Boot的主要目标之一。

application.properties – 缺省属性文件

spring boot 应用是典型基于配置文件规范约定。我们可以简单地放“application.properties” 文件在“src/main/resources”目录中,spring boot会自定监测,我们能在其中放入任何属性。

通过使用缺省文件,我们无须显示注册PropertySource并指定属性文件路径。我们也可以在运行时使用环境变量属性指定不同的属性配置文件:


java -jar app.jar --spring.config.location=classpath:/another-location.properties

特定环境属性文件

如果我们需要针对不同环境,spring boot内置机制可以满足。我们可以在“src/main/resources”目录中定义“application-environment.properties” 文件,然后设置spring profile与environment名称一致。

例如,如果我们定义“staging” 环境变量,则我们必须定义staging profile,然后定义application-staging.properties属性文件。

特定环境属性文件加载优先级高于缺省属性文件。注意,默认文件仍然会被加载,只是当有属性冲突时,特定环境属性文件优先。

特定测试属性文件

在应用测试阶段,我们可能需要不同的属性值。Spring Boot通过在测试运行期间查找“src/test/resources”目录中的属性文件来处理这个问题。同样,默认属性仍然会被加载,但是如果发生冲突,将会覆盖这些属性。

@TestPropertySource注解

如果需要更细粒度控制测试属性,我们可以使用@TestPropertySource注解。其可以设置给测试上下文设置测试属性,比缺省属性源优先级高:


@ContextConfiguration
@TestPropertySource("/my-test.properties")
public class IntegrationTests {
    // tests
}

如果我们不想使用文件,也直接指定名称和值:


@ContextConfiguration
@TestPropertySource("foo=bar", "bar=foo")
public class IntegrationTests {
    // tests
}

也可以通过@SpringBootTest注解,指定相应properties参数值达到同样效果:


@SpringBootTest(properties = {"foo=bar", "bar=foo"})
public class IntegrationTests {
    // tests
}

层次属性

如果属性按分组形式配置,可以使用 @ConfigurationProperties注解,其会按照对象图方式映射这些分层组织属性。下面示例看看数据库连接配置属性:


database.url=jdbc:postgresql:/localhost:5432/instance
database.username=foo
database.passWord=bar

然后使用注解映射至数据库对象:


@ConfigurationProperties(prefix = "database")
public class Database {
    String url;
    String username;
    String password;
    // standard getters and setters
}

spring boot 在配置方法中再次应用了基于约定原则,自动映射属性值对象字段,我们仅需提供属性前缀即可。

YAML 文件

YAML文件也支持。

同样名称规则可以应用至测试规范、environmet规范以及缺省属性文件。仅文件扩展名不同以及需提供SnakeYAML依赖。

YAML对层次属性存储特别方便,下面的属性文件:


database.url=jdbc:postgresql:/localhost:5432/instance
database.username=foo
database.password=bar
secret: foo

对应的YAML文件为:


database:
  url: jdbc:postgresql:/localhost:5432/instance
  username: foo
  password: bar
secret: foo

需要注意的是YAML文件不支持使用@PropertySource注解,所以如果使用该注解则必须使用属性文件。

命令行传入属性

相对于使用文件,属性也可以直接通过命令行进行传递:


java -jar app.jar --property="value"

你也能通过系统属性实现,需要在-jar命令之前提供:


java -Dproperty.name="value" -jar app.jar

环境变量属性

spring boot也能监测环境变量,效果与属性一样:


export name=value
java -jar app.jar

随机属性值

如果属性值不确定,RandomValuePropertySource 可以实现给属性赋随机值:


random.number=${random.int}
random.long=${random.long}
random.uuid=${random.uuid}

其他类型的属性源

spring boot 支持很多属性源,实现较好顺序及合理覆盖。其官方文档可以参阅。

spring配置实现

  • spring3.1之前

spring3.1引入注解,可以方便地定义属性源,在此之前,xml配置是必须的。 xml元素自动在spring上下文中注册新的PropertyPlaceholderConfigurer bean。为了向后兼容,在spring3.1及之后版本中,如果XSD schemas不升级到新的3.1 XSD版本,仍然会创建相应bean。

  • spring3.1之后

从spring3.1起,XML 元素不再注册旧的PropertyPlaceholderConfigurer 类,代替引入PropertySourcesPlaceholderConfigurer类,新的类可以实现更灵活地和Environment 和 PropertySource机制进行交互。

对3.1之后版本,应该应用新的标准。

多层级上下文中属性加载

WEB应用有父和子上下文时,属性如何加载是很常见的问题。父上下文有一些通用的核心功能和bean,并包括一个或多个子上下文,可能包含servlet特定的bean。

这种场景下,如何最佳方式定义属性文件并引入到各自的上下文中?以及如何在spring中以最佳方式获取这些属性,下面分类进行说明:

属性文件通过定义xml中

如果文件定义在父上下文:

  • @Value 在子上下文 : 否
  • @Value 在父上下文 : 是

如果文件定义在子上下文:

  • @Value 在子上下文 : 是
  • @Value 在父上下文 : 否

总之如上所述,没有暴露属性给environment,所以environment.getProperty在上下文中不工作。

属性文件通过@PropertySource定义在java中

如果文件定义在父上下文:

  • @Value 在子上下文 : 是
  • @Value 在父上下文 : 是
  • environment.getProperty 在子上下文: 是
  • environment.getProperty 在父上下文: 是

如果文件定义在子上下文:

  • @Value 在子上下文 : 是
  • @Value 在父上下文 : 否
  • environment.getProperty 在子上下文: 是
  • environment.getProperty 在父上下文: 否

总结

本文通过几个示例说明了spring中加载属性机制。希望能给大家一个参考,也希望大家多多支持编程网。

--结束END--

本文标题: spring 和 spring boot 中的属性配置方式

本文链接: https://www.lsjlt.com/news/134991.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • spring 和 spring boot 中的属性配置方式
    目录在xml中注册属性文件多个通过java注解方式注册属性文件使用及注入属性属性搜索优先级spring boot 属性加载application.properties – 缺省属性文...
    99+
    2022-11-12
  • spring boot中配置hikari连接池属性方式
    目录spring boot配置hikari连接池属性spring-boot默认连接池Hikari配置Hikari连接池配置说明spring boot配置hikari连接池属性 事件起...
    99+
    2022-11-12
  • Spring boot配置绑定和配置属性校验的方式详解
    目录配置绑定先建立数据配置文件application.yml@ConfigurationProperties@Value第一种 @Value(“${}”)第二...
    99+
    2022-11-13
  • 如何配置Spring Boot 的属性
    如何配置Spring Boot 的属性?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代...
    99+
    2023-05-31
    springboot spring boo bo
  • spring boot配置dubbo方式(properties)
    目录spring boot与dubbo配置有两种方式本篇主要说在自己配置文件里配置dubbo的步骤1) dubbo接口发布者配置2) dubbo接口消费者配置总结dubbo和zook...
    99+
    2023-01-03
    spring boot配置dubbo spring boot properties spring boot配置
  • Spring Boot中的max-http-header-size配置方式
    目录关于max-http-header-size配置 概述Max-HTTP-Header-Size请求头太大max-http-header-size配置不合理导致OOM问题...
    99+
    2022-11-13
  • spring boot怎么获取配置文件的属性
    这篇文章主要介绍“spring boot怎么获取配置文件的属性”,在日常操作中,相信很多人在spring boot怎么获取配置文件的属性问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”spring boot怎么...
    99+
    2023-06-05
  • Spring Boot配置方式的示例分析
    这篇文章给大家分享的是有关Spring Boot配置方式的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Spring Boot 允许通过外部配置让你在不同的环境使用同一应用程序的代码,简单说就是可以通过配...
    99+
    2023-05-30
    spring boot
  • Spring Boot 如何正确读取配置文件属性
    目录前言@Value示例代码@ConfigurationProperties示例代码@EnableConfigurationProperties@ConfigurationPrope...
    99+
    2022-11-13
  • Spring Boot怎么正确读取配置文件属性
    这篇“Spring Boot怎么正确读取配置文件属性”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Spring&n...
    99+
    2023-06-30
  • Spring Boot配置多数据源的四种方式
    1、导读 在日常开发中我们都是以单个数据库进行开发,在小型项目中是完全能够满足需求的。 但是,当我们牵扯到像淘宝、京东这样的大型项目的时候,单个数据库就难以承受用户的CRUD操作。 那么此时,我们就需要使用多个数据源进行读写分离的操作,这种...
    99+
    2023-08-20
    spring boot java 数据库 mybatis 后端
  • Spring Boot DevTools全局配置的方法
    这篇文章主要讲解了“Spring Boot DevTools全局配置的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot Dev...
    99+
    2023-06-29
  • Spring Boot整合Mybatis的配置方法
    这篇文章主要讲解了“Spring Boot整合Mybatis的配置方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Spring Boot整合Mybatis的配置方法”吧!目录配置文件形式p...
    99+
    2023-06-20
  • Spring Boot使用yml格式进行配置的方法
    Spring Boot使用yml格式进行配置的方法分为以下几个步骤:1. 在项目的`src/main/resources`目录下创建...
    99+
    2023-08-16
    Spring Boot
  • Spring注解@Value及属性加载配置文件方式
    Spring中使用@Value注解给bean加载属性的配置文件有两种使用方式 第一种:使用@Value("#{configProperties['websit.msgname']}"...
    99+
    2022-11-12
  • spring boot 配置Filter过滤器的方法
    Filter 过滤器是web开发中很重要的一个组件,下面以一个session登陆的例子介绍下spring boot中如何使用Filter首先要准备一个实现了Filter的接口的类 SessionFilter:import org.slf4j...
    99+
    2023-05-31
    spring boot 配置
  • @FeignClient的使用和Spring Boot的版本适配方式
    目录@FeignClient使用和SpringBoot版本适配SpringCloud与SpringBoot版本兼容性在pom文件中添加依赖然后再给大家说一下Feign的使用Sprin...
    99+
    2022-11-13
  • 详解Spring-boot中读取config配置文件的两种方式
    了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件的信息。Spring-Boot读取配置文件的方式:一.读取核心配置文件信息ap...
    99+
    2023-05-31
    spring boot config
  • spring cloud 配置中心native配置方式
    目录spring cloud 配置中心native配置1、pom文件添加依赖2、配置文件application.properties中配置本地路径3、主程序开启@EnableConf...
    99+
    2022-11-12
  • Spring Boot 配置 Quartz 定时任务的方法
    Quartz有四个核心概念: Job:是一个接口,只定义一个方法 execute(JobExecutionContext context),在实现接口的 execute 方法中编写所...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作