目前知道的获取配置文件中的值的注解有2个@ConfigurationProperties和@Value
@ConfigurationProperties
出自springboot
主要用在类上边
可以用来获取配置文件中集合的值
可以配合@Configuration来实现读取配置文件参数并在项目启动过程中加载进Bean实例中。如当使用Springboot+shiro时,shiro框架有一些Bean是在项目启动时实例化的,且带有可配置的参数,这时候就可使用上边的方法实现即创建Bean实例又注入配置文件的配置参数。
@Configuration出自spring,具体用法可以在网上找找。
@Value
出自spring
主要用在属性上边
不可以用来获取配置文件中集合的值
二则都必须使用在Bean的实例中,就是2个注解必须放在被@Controller,@Service,@Component等注解的类里边。普通类使用这2个注解是无法获取到值的
案例
创建一个application.yaml,内容如下:
my:
servers:
- dev.bar.com
- foo.bar.com
port: 8080
name: lilei
name: hanmeimei
创建一个Protest.java的类用来封装配置文件的参数
package com.example.springboot.common;
import java.util.ArrayList;
import java.util.List;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@ConfigurationProperties(prefix = "my")
public class Protest {
//因为配置文件中有2个名字为name的配置,此处的name就是my.name,值为lilei
//如果此处加上@Value("${name}")会被忽略,优先使用的还是my.name的值
private String name;
private String port;
private List<String> servers = new ArrayList<String>();
//因为配置文件中有2个名字为name的配置,此处的name会获取配置文件中的第二个name,值为hanmeimei
@Value("${name}")
private String otherName;
//因为@ConfigurationProperties使用了(prefix = "my")所以当不使用@Value("${env}")是获取不了配置文件env的值的
@Value("${env}")
private String env;
public Protest() {
//此处可在项目启动过程中打印在控制台
System.out.println("开始构造Protest的实例");
}
public String getName() {
System.out.println("正在获取name的值");
return name;
}
public void setName(String name) {
System.out.println("正在设置name的值");
this.name = name;
}
public String getPort() {
return port;
}
public void setPort(String port) {
this.port = port;
}
public List<String> getServers() {
return servers;
}
public void setServers(List<String> servers) {
this.servers = servers;
}
public String getOtherName() {
return otherName;
}
public void setOtherName(String otherName) {
this.otherName = otherName;
}
public String getEnv() {
return env;
}
public void setEnv(String env) {
this.env = env;
}
}
创建一个Controller来测试下,看看输出结果:
package com.example.springboot.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.example.springboot.common.Protest;
@RestController
public class HelloController {
@Autowired
private Protest pt;
@RequestMapping("/")
public String helloTest() {
System.out.println(pt.getName());
System.out.println(pt.getPort());
System.out.println(pt.getServers().size());
System.out.println(pt.getOtherName());
System.out.println(pt.getEnv());
return "hello world";
}
}
最终控制台输出:
lilei
8080
2
hanmeimei
8080
2
hanmeimei
test