如何获取yml里面的属性值
开发环境
- idea
- jdk1.8
项目结构
pom依赖
<?xml version="1.0" encoding="UTF-8"?>
<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 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.springboot</groupId>
<artifactId>springboot_demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_demo</name>
<description>Demo project for Spring Boot</description>
<properties>
<java.version>1.8</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<!--导入配置文件处理器,配置文件绑定数据会有数据-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build>
</project>
springboot启动类
package com.springboot.springboot_demo;
import org.springframework.beans.factory.config.YamlPropertiesFactoryBean;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;
import org.springframework.core.io.ClassPathResource;
@SpringBootApplication
public class SpringbootDemoApplication {
public static void main(String[] args) {
SpringApplication.run(SpringbootDemoApplication.class, args);
}
@Bean
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer pspc = new PropertySourcesPlaceholderConfigurer();
YamlPropertiesFactoryBean yaml = new YamlPropertiesFactoryBean();
yaml.setResources(
new ClassPathResource[] {
new ClassPathResource("config/person.yml")
});
pspc.setProperties(yaml.getObject());
return pspc;
}
}
person.yml
person:
lastName: zhangsan
age: 18
boss: false
birth: 2017/12/12
maps: {k1: v1,k2: v2}
lists:
- lisi
- zhaoliu
dog:
name: 小狗
age: 2
person.java
package com.springboot.springboot_demo.pojo;
import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.Date;
import java.util.List;
import java.util.Map;
@Data
@Component
@ConfigurationProperties(prefix = "person")
public class Person {
private String lastName;
private Integer age;
private Boolean boss;
private Date birth;
private Map<String,Object> maps;
private List<Object> lists;
private Dog dog;
}
Dog.java
package com.springboot.springboot_demo.pojo;
import lombok.Data;
@Data
public class Dog {
private String name;
private String age;
}
SpringbootDemoApplicationTests
package com.springboot.springboot_demo;
import com.springboot.springboot_demo.pojo.Person;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class SpringbootDemoApplicationTests {
@Autowired
private Person person;
@Value("${person.lastName}")
private String username;
@Test
public void contextLoads() {
System.out.println(person);
}
@Test
public void personCopy() {
System.out.println(username);
}
}
控制台输出
Person(lastName=zhangsan, age=18, boss=false, birth=Tue Dec 12 00:00:00 CST 2017, maps={k1=v1, k2=v2}, lists=[lisi, zhaoliu], dog=Dog(name=小狗, age=2))
zhangsan
获取.yml中自定义参数
需求:根据不同环境获取到不同的参数,放在.yml中方便修改!
在开发环境中,回调的url地址
在测试环境中,回调的url地址
在生产环境中,回调的url地址
我是通过2种方式来实现的
通过@Value获取
代码如下
package com.heque.service.pay;
import org.springframework.beans.factory.annotation.Value;
public abstract class ObtainNotifyUrl {
@Value("${weixinAndAli.wechatNotifyUrl}")
private String wechatNotifyUrl;
@Value("${weixinAndAli.aliNotifyUrl}")
private String aliNotifyUrl;
public String getWechatNotifyUrl() {
return wechatNotifyUrl;
}
public void setWechatNotifyUrl(String wechatNotifyUrl) {
this.wechatNotifyUrl = wechatNotifyUrl;
}
public String getAliNotifyUrl() {
return aliNotifyUrl;
}
public void setAliNotifyUrl(String aliNotifyUrl) {
this.aliNotifyUrl = aliNotifyUrl;
}
}
package com.heque.service.pay;
import org.springframework.stereotype.Component;
import lombok.Data;
import lombok.EqualsAndHashCode;
@Data
@EqualsAndHashCode(callSuper = false)
@Component
public class Test extends ObtainNotifyUrl{
}
通过springframework自动包可以完成此功能,需要注意Test继承对象需要加入@component,把对象交给springContainer去管理,我们需要的时候只需注入资源就好了。
@Autowired private Test test; test.getAliNotifyUrl();/test.getWechatNotifyUrl();
通过@ConfigurationProperties(prefix = "weixinAndAli")注解
代码如下
package com.heque.service.pay;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "weixinAndAli")
public class ConfigUtils {
private String wechatNotifyUrl;
private String aliNotifyUrl;
public String getWechatNotifyUrl() {
return this.wechatNotifyUrl;
}
public void setWechatNotifyUrl(String wechatNotifyUrl) {
this.wechatNotifyUrl = wechatNotifyUrl;
}
public String getAliNotifyUrl() {
return aliNotifyUrl;
}
public void setAliNotifyUrl(String aliNotifyUrl) {
this.aliNotifyUrl = aliNotifyUrl;
}
}
调用和方法一一样的
以上为个人经验,希望能给大家一个参考,也希望大家多多支持编程网。