springboot之properties
本例将采用maven管理,代码托管在github上,地址:https://github.com/wolf909867753/springboot。
1。创建maven-module,properties,并在pom.xml中添加springboot依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd"> <modelVersion>4.0.0</modelVersion> <artifactId>properties</artifactId> <packaging>war</packaging> <name>springboot-properties Demo</name> <url>http://maven.apache.org</url> <!-- Spring Boot 启动父依赖 --> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>1.5.1.RELEASE</version> </parent> <dependencies> <!-- Spring Boot Web 依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> <scope>test</scope> </dependency> </dependencies> <build> <finalName>properties</finalName> </build> </project>
工程目录如下:
代码参考github code
使用application.properties配置文件加载的测试DEMO
参考com.springboot.properties此包下的code
1.创建HomeProperties类
@Component @ConfigurationProperties(prefix="home") public class HomeProperties { /** * 省份 */ private String province; /** * 城市 */ private String city; /** * 描述 */ private String desc; getter/setter.....}
2.配置文件
application-pro.properties
home.province = shang dong sheng home.city = wei fang shi home.desc = [application-pro] i come from ${home.province} ${home.city}.
application-dev.properties
home.province = shandong home.city = weifang home.desc = [application-dev] i come from ${home.province}--${home.city}
application.properties
spring.profiles.active=pro
3.测试
参考test下com.springboot.properties.PropertiesTest.java
@SpringBootApplication public class PropertiesTest implements CommandLineRunner{ @Autowired private HomeProperties homeProperties; @Override public void run(String... strings) throws Exception { System.out.println(">>>>>>>>>>>>>> "+homeProperties.toString()); } /** * 使用application.yml运行输出以下结果: * HomeProperties{province='山东省', city='潍坊市', desc='我来自山东省潍坊市.'} * * 使用application.properties根据spring.profiles.active的value运行加载其对应的application-*.properties输出以下结果: * HomePropertiesYML{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'} */ public static void main(String[] args) { SpringApplication.run(PropertiesTest.class,args); } }
运行main方法,加载使用application.properties根据spring.profiles.active的value运行加载其对应的application-*.properties输出以下结果:
HomeProperties{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'}
=======================================================================================
使用application.yml配置文件加载的测试DEMO
参考com.springboot.properties此包下的code
1.创建HomePropertiesYML.java
@Component public class HomePropertiesYML { /** * 省份 */ @Value("${home.province}") private String province; /** * 城市 */ @Value("${home.city}") private String city; /** * 描述 */ @Value("${home.desc}") private String desc; getter/setter....}
2.配置文件
application.yml 注意项目下不能同时存在application.properties 和 application.yml
home: province : 山东省 city : 潍坊市 desc : 我来自${home.province}${home.city}.
3.测试
参考test下com.springboot.properties.YMLpropertiesTest.java
@SpringBootApplication public class YMLpropertiesTest implements CommandLineRunner { @Autowired private HomePropertiesYML homePropertiesYML; @Override public void run(String... strings) throws Exception { System.out.println(">>>>>>>>>>>> "+homePropertiesYML.toString()); } /** * 使用application.yml运行输出以下结果: * HomePropertiesYML{province='山东省', city='潍坊市', desc='我来自山东省潍坊市.'} * * 使用application.properties根据spring.profiles.active的value运行加载其对应的application-*.properties输出以下结果: * HomePropertiesYML{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'} */ public static void main(String[] args) { SpringApplication.run(YMLpropertiesTest.class,args); // System.exit(-1); } }
运行main方法,加载使用application.yml配置文件,输出以下结果:
HomePropertiesYML{province='山东省', city='潍坊市', desc='我来自山东省潍坊市.'}
小结:
/**
* Spring Boot 配置文件 使用application.properties
* 测试类参考test目录下的PropertiesTest.java
*一、自动配置
* Spring Boot 提供了对应用进行自动化配置。相比以前 XML 配置方式,很多显式方式申明是不需要的。二者,大多数默认的配置足够实现开发功能,从而更快速开发。
* 什么是自动配置?
* Spring Boot 提供了默认的配置,如默认的 Bean ,去运行 Spring 应用。它是非侵入式的,只提供一个默认实现。
* 大多数情况下,自动配置的 Bean 满足了现有的业务场景,不需要去覆盖。但如果自动配置做的不够好,需要覆盖配置。
* 比如通过命令行动态指定某个 jar ,按不同环境启动。那怎么办?这里先要考虑到配置的优先级。
*
* Spring Boot 不单单从 application.properties 获取配置,所以我们可以在程序中多种设置配置属性。按照以下列表的优先级排列:
* 1.命令行参数
* 2.java:comp/env 里的 JNDI 属性
* 3.JVM 系统属性
* 4.操作系统环境变量
* 5.RandomValuePropertySource 属性类生成的 random.* 属性
* 6.应用以外的 application.properties(或 yml)文件
* 7.打包在应用内的 application.properties(或 yml)文件
* 8.在应用 @Configuration 配置类中,用 @PropertySource 注解声明的属性文件
* 9.SpringApplication.setDefaultProperties 声明的默认属性
*
* 可见,命令行参数优先级最高。这个可以根据这个优先级,可以在测试或生产环境中快速地修改配置参数值,而不需要重新打包和部署应用。
* 还有第 6 点,根据这个在多 moudle 的项目中,比如常见的项目分 api 、service、dao 等 moudles,往往会加一个 deploy moudle 去打包该业务各个子 moudle,
* 应用以外的配置优先。
*
* 二[email protected](prefix="home")
* 通过 @ConfigurationProperties(prefix = “home”) 注解,将配置文件中以 home 前缀的属性值自动绑定到对应的字段中。
* 同是用 @Component 作为 Bean 注入到 Spring 容器中。
*
* 注意:当reources中同时存在application.properties ,application.yml文件时,spring优先启动application.properties配置文件
*/
多环境配置 很多场景的配置,比如数据库配置、Redis 配置、注册中心和日志配置等。在不同的环境,我们需要不同的包去运行项目。所以看项目结构,有两个环境的配置: application-dev.properties:开发环境 application-prod.properties:生产环境 Spring Boot 是通过 application.properties 文件中,设置 spring.profiles.active 属性,比如 ,配置了 dev ,则加载的是 application-dev.properties : # Spring Profiles Active spring.profiles.active=dev 那运行PropertiesTest应用启动类,从控制台中可以看出,是加载了 application-dev.properties 的属性输出: HomeProperties{province='shang dong', city='wei fang', desc='[application-dev] i come from shang dong wei fang.'} 将 spring.profiles.active 设置成 prod,重新运行,可得到 application-pro.properties的属性输出: HomeProperties{province='shang dong sheng', city='wei fang shi', desc='[application-pro] i come from shang dong sheng wei fang shi.'} 根据优先级,顺便介绍下 jar 运行的方式,通过设置 -Dspring.profiles.active=pro 去指定相应的配置: mvn package java -jar -Dspring.profiles.active=prod springboot-properties-0.0.1-SNAPSHOT.jar