关键词:
1.概述
本教程将展示如何在Spring中设置和使用Properties - 通过Java配置和@PropertySource或通过XML和<property-placeholder>,以及属性如何在Spring Boot中工作。
2.通过Java注解注册属性文件
Spring 3.1还引入了新的@PropertySource注解,作为向环境添加属性源的便捷机制。此注解将与基于Java的配置和@Configuration批注结合使用:(注意,只能引入properties,不能引入yml)
@Configuration @PropertySource("classpath:foo.properties") public class PropertiesWithJavaConfig //...
注册新属性文件的另一个非常有用的方法是使用占位符来允许您在运行时动态选择正确的文件 ; 例如:
@PropertySource( "classpath:persistence-$envTarget:mysql.properties" )
2.1.定义多个属性位置(多数据源)
该@PropertySource注释是可重复的,根据java8的约定。因此,如果我们使用Java 8或更高版本,我们可以使用此批注来定义多个属性位置:
@PropertySource("classpath:foo.properties") @PropertySource("classpath:bar.properties") public class PropertiesWithJavaConfig //...
当然,我们也可以使用@PropertySources注释并指定一个@PropertySource数组。这适用于任何受支持的Java版本,而不仅仅是Java 8或更高版本:
@PropertySources( @PropertySource("classpath:foo.properties"), @PropertySource("classpath:bar.properties") ) public class PropertiesWithJavaConfig //...
在任何一种情况下,值得注意的是,在属性名称冲突的情况下,最后一个源数据中的属性优先。
3.以XML格式注册属性文件
在XML中,新的属性文件可以通过<context:property-placeholder … > 进行访问到spring的命名空间元素:
<context:property-placeholder location="classpath:foo.properties" />
该foo.properties文件应在放在/src/main/resources,使其可在运行时在类路径下能找到。
如果Spring上下文中存在多个<property-placeholder>元素,则有一些建议的最佳实践:
- order属性需要被指定为固定的
3.1.以XML格式注册多个属性文件
在上一节中,我们了解了如何使用Java 8或更高版本中的注释定义多个属性文件。同样,我们可以使用XML配置定义多个属性文件:
<context:property-placeholder location="classpath:foo.properties, classpath:bar.properties"/>
并且,和以前一样,如果属性名称冲突,则最后一次源读取优先。
4.使用/注入属性
使用@Value注解注入属性非常简单:
@Value( "$jdbc.url" ) private String jdbcUrl;
还可以指定属性的默认值:
@Value( "$jdbc.url:aDefaultUrl" ) private String jdbcUrl;
在Spring XML配置中使用属性:
<bean id="dataSource"> <property name="url" value="$jdbc.url" /> </bean>
旧版PropertyPlaceholderConfigurer和Spring 3.1中添加的新PropertySourcesPlaceholderConfigurer都解析了 bean定义属性值和@Value注释中的$ ...占位符。
最后 - 我们可以 使用Environment API 获取属性的值 :
@Autowired private Environment env; ... dataSource.setUrl(env.getProperty("jdbc.url"));
一个非常重要的警告是使用<property-placeholder>不会将属性公开给Spring环境 - 这意味着检索这样的值将不起作用 - 下面将返回null:
env.getProperty("key.something")
5. Spring Boot属性
在我们进入属性的更高级配置选项之前,让我们花一些时间来查看Spring Boot中的新属性支持。
一般来说,与标准Spring相比,这种新的支持涉及更少的配置,这当然是Boot的主要目标之一。
5.1.application.properties - 默认属性文件
Boot将其典型约定应用于属性文件的配置方法。这意味着我们可以简单地将“ application.properties ”文件放在我们的“ src/main/resources”目录中,它将被自动检测到。然后我们可以正常注入任何加载的属性。
因此,通过使用此默认文件,我们不必显式注册PropertySource,甚至不必提供属性文件的路径。
如果需要,我们还可以在运行时使用环境属性配置不同的文件:
java -jar app.jar --spring.config.location=classpath:/another-location.properties
5.2.环境特定属性文件
如果我们需要针对不同的环境,那么Boot中就有一个内置机制。
我们可以简单地在“src/main/resources”目录中定义“application-environment.properties”文件- 然后使用相同的环境名称设置Spring配置文件。
例如,如果我们定义一个“staging”环境,那意味着我们必须定义一个staging配置文件,然后定义application-staging.properties。
此env文件将被加载,并将优先于默认属性文件。请注意,仍将加载默认文件,只是在存在属性冲突时,环境特定属性文件优先。
5.3.测试特定属性文件
当我们的应用程序正在测试时,我们可能还需要使用不同的属性值。
Spring Boot通过在测试运行期间查看我们的“ src / test / resources ”目录来为我们处理这个问题。同样,默认属性仍然可以正常注入,但如果发生冲突,将覆盖这些属性。
5.4.@TestPropertySource注解
如果我们需要对测试属性进行更精细的控制,那么我们可以使用@TestPropertySource注释。
这允许我们为特定测试上下文设置测试属性,优先于默认属性源:
@ContextConfiguration @TestPropertySource("/my-test.properties") public class IntegrationTests // tests
如果我们不想使用文件,我们可以直接指定名称和值:
@ContextConfiguration @TestPropertySource("foo=bar", "bar=foo") public class IntegrationTests // tests
我们也可以使用@SpringBootTest注释的属性参数来实现类似的效果:
@SpringBootTest(properties = "foo=bar", "bar=foo") public class IntegrationTests // tests
5.5.分层属性
如果我们将属性组合在一起,我们可以使用@ConfigurationProperties批注,它将这些属性层次结构映射到Java对象中。
我们来看一些用于配置数据库连接的属性:
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再次将其约定应用于配置方法,自动映射属性名称及其相应字段。我们需要提供的只是属性前缀。
5.6.替代方案 - YAML文件
还支持YAML文件。
所有相同的命名规则适用于特定于测试,特定于环境和默认的属性文件。唯一的区别是文件扩展名,以及对类路径上的SnakeYAML库的依赖性。
YAML特别适用于分层财产存储; 以下属性文件:
database.url=jdbc:postgresql:/localhost:5432/instance database.username=foo database.password=bar secret: foo
与以下YAML文件同义:(yml以空格作为解析格式,不同级的属性之间,缩进两个空格)
database: url: jdbc:postgresql:/localhost:5432/instance username: foo password: bar secret: foo
还值得一提的是,YAML文件不支持@PropertySource注释,因此如果需要使用注释,则会限制我们使用属性文件。
5.7.命令行参数中的属性
与使用文件相反,属性可以直接在命令行上传递:
java -jar app.jar --property="value"
您也可以通过系统属性执行此操作,系统属性在-jar命令之前而不是之后提供:
java -Dproperty.name="value" -jar app.jar
5.8.环境变量的属性
Spring Boot还会检测环境变量,将它们视为属性:
export name=value
java -jar app.jar
5.9.属性值随机化
如果我们不想要确定性属性值,可以使用RandomValuePropertySource随机化属性值:
random.number=$random.int random.long=$random.long random.uuid=$random.uuid
5.10.其他类型的属性来源
Spring Boot支持众多属性源,实现了一个经过深思熟虑的排序,以实现合理的覆盖。值得查阅官方文档,这超出了本文的范围。
6.结论
本文展示了在Spring中使用属性和属性文件的几个示例。
springboot属性配置和使用(代码片段)
SpringBoot属性配置和使用SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。简单说就... 查看详情
springboot之属性读写详解(代码片段)
SpringBoot之属性读写详解加载property顺序随机属性命令行属性Application属性文件Profile特定属性属性中的占位符YAML属性访问属性多profile配置YAML的缺点属性前缀属性松散绑定规则属性转换时间单位转换数据大小转换校验属性源码引申... 查看详情
spring和springboot常用注解总结(代码片段)
@RequestMapping这个注解可以用于类和方法上,用于类上,表示父路径,如类上是demo,方法上是/demo1,那么访问路径就是demo/demo1该注解有六个属性:params:指定request中必须包含某些参数值是,才让该方法处理。headers:指定request中必... 查看详情
springboot启动jar包时设置临时属性(代码片段)
什么是临时属性临时属性是指在运行SpringBoot应用程序时,临时指定的一些属性值。临时属性值只对该次运行有效,在下次启动应用程序时将被重置。这种方式可以极大地方便我们测试不同的应用场景和配置,而不需要修改配置... 查看详情
springboot缓存注解介绍(代码片段)
SpringBoot缓存注解介绍1.@EnableCaching注解2.@Cacheable注解@Cacheable注解相关属性3.@CachePut注解4.@CacheEvict注解5.@Caching注解6.@CacheConfig注解。本文介绍在使用Spring缓存时,所应用到的一些注解和相对应的属性,... 查看详情
spring编程:springboot属性配置和属性优先级
SpringBoot允许我们外部化程序的配置,以便我们可以在不同的环境中使用相同的应用代码。我们可以使用properties、YAML、环境变量、命令行参数进行外部化配置。配置的属性值可以通过@Value注解直接注入到beans中,通过Sp... 查看详情
(拿来主义-8)springboot属性配置文件详解(代码片段)
相信很多人选择SpringBoot主要是考虑到它既能兼顾Spring的强大功能,还能实现快速开发的便捷。我们在SpringBoot使用过程中,最直观的感受就是没有了原来自己整合Spring应用时繁多的XML配置内容,替代它的是在pom.xml中引入模块化的... 查看详情
springboot-注解讲解(代码片段)
@Configuration:声明我们JdbcConfig是一个配置类@PropertySource:指定属性文件的路径是:classpath:jdbc.properties通过@Value为属性注入值通过@Bean将dataSource()方法声明为一个注册Bean的方法,Spring会自动调用该方法,将方法的返回值加入Spring容... 查看详情
测开面试之spring和springboot的区别(代码片段)
概述对于Spring和SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习SpringBoot的我当时也是一头雾水,随着经验的积累、我慢慢理解了这两个框架到底有什么区别,相信对于用了SpringBoot很久的同学来说... 查看详情
测开面试之spring和springboot的区别(代码片段)
概述对于Spring和SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习SpringBoot的我当时也是一头雾水,随着经验的积累、我慢慢理解了这两个框架到底有什么区别,相信对于用了SpringBoot很久的同学来说... 查看详情
springboot|集成mapstruct实现不同类型java对象间的自动转换(代码片段)
MapStruct简介MapStruct是一个开源的代码生成器,极大地简化了从一种Java对象到另一种Java对象的转换过程。MapStruct常用注解注解说明@Mapper用于标注Mapper接口,MapStruct根据接口定义自动生成Mapper实现类。@Mapping用于标注接口方法或者... 查看详情
spring——springboot创建和使用(代码片段)
...的读取和存储对象ⅡSpring——Bean作用域和生命周期目录SpringBoot创建和使用SpringBootSpringBoot项目创建使用IDEA创建网页版创建SpringBoot目录介绍运行SpringBoothelloworld约定大于配置SpringBoot创建和使用SpringBootSpring的诞生就是为了简化Java... 查看详情
springboot和spring到底有啥区别?用了这么久,你知道吗?(代码片段)
概述对于Spring和SpringBoot到底有什么区别,我听到了很多答案,刚开始迈入学习SpringBoot的我当时也是一头雾水随着经验的积累、我慢慢理解了这两个框架到底有什么区别。相信对于用了SpringBoot很久的同学来说,还不是很理解Spring... 查看详情
springboot整合spring@cache和redis(代码片段)
转载请注明出处:https://www.cnblogs.com/wenjunwei/p/10779450.htmlspring基于注解的缓存对于缓存声明,spring的缓存提供了一组java注解:@Cacheable:触发缓存写入。@CacheEvict:触发缓存清除。@CachePut:更新缓存(不会影响到方法的运行)。@Caching:重新... 查看详情
spring和springboot常用注解总结(代码片段)
原文链接:http://www.cnblogs.com/tinyj/p/9786013.htmlhttps://blog.csdn.net/yitian_66/article/details/80866571@ConfigurationProperties可以非常方便的把资源文件中的内容绑定到对象上首先在配置文件里面,这些信息是这样子滴connection.username=adminconnec 查看详情
springboot.02.springboot创建对象与属性注入(代码片段)
SpringBoot创建对象与属性注入前言所谓SpringBoot创建对象就是将对象交给Spring来管理。在SpringBoot中我们可以使用注解。比如我们常用的@Component及@Controller、@Service、@Repository等。不过这种方式一次只能创建一个对象;... 查看详情
springboot.02.springboot创建对象与属性注入(代码片段)
SpringBoot创建对象与属性注入前言所谓SpringBoot创建对象就是将对象交给Spring来管理。在SpringBoot中我们可以使用注解。比如我们常用的@Component及@Controller、@Service、@Repository等。不过这种方式一次只能创建一个对象;... 查看详情
springboot属性配置和使用
...就是可以通过配置文件来注入属性或者修改默认的配置。SpringBoot系列SpringBoot入门SpringBoot属性配置和使用SpringBoot集成MyBatisSpringBoot静态资源处理SpringBoot-配置排序依赖技巧SpringBoot-DevTools介绍SpringBoot支持 查看详情