spring boot配置文件中除了可以配置约定好的属性外,我们也可以在里面添加自己需要的配置信息。主要有两种方式。
@Value注解
使用@Value注解是用于逐个的读取自定义的配置,你想用哪个就将所需要的配置引进去。下面举一个例子。
我们首先在配置文件中添加我们自己的配置。
#自定义配置
boot.name=springboot
boot.location=北京
然后再新建一个controller来用于访问和读取配置文件中的值。
package com.example.demo.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * @Description: 使用@Value注解读取自定义配置 * @Author: haoqiangwang3 * @CreateDate: 2019/12/30 */ @RestController public class ConfigInfoController { @Value("${boot.name}") private String name; @Value("${boot.location}") private String location; @RequestMapping("/config") public String config(){ return "name=" + name + ";location=" + location; } }
最后启动项目,并在浏览器中访问http://127.0.0.1:8088/demo/config,结果响应为:
如果中文响应乱码,需要设置下idea的文件编码为UTF-8。
@ConfigurationProperties
次注解用于将整个文件映射成一个对象。我们可以新建一个对象,用于接收配置文件里面的信息。如下:
package com.example.demo.config; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.stereotype.Component; @Component @ConfigurationProperties(prefix = "boot") public class ConfigBo { private String name; private String location; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getLocation() { return location; } public void setLocation(String location) { this.location = location; } }
里面的@ConfigurationProperties中使用的前缀prefix属性,应为我们自定义的配置都是boot开头的,所以根据此特征,将前缀设置成boot。我们这个类还需要加@Component注解,把此类注入到spring容器中,才能使用@ConfigurationProperties功能。
然后我们修改controller类,将属性配置的实体引进去。
package com.example.demo.controller; import com.example.demo.config.ConfigBo;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import javax.annotation.Resource; /** * @Description: 使用注解读取自定义配置 * @Author: haoqiangwang3 * @CreateDate: 2019/12/30 */ @RestController public class ConfigInfoController { @Resource private ConfigBo configBo; @RequestMapping("/configBo") public String configBo(){ return "name=" + configBo.getName() + ";location=" + configBo.getLocation(); } }
在浏览器中访问http://127.0.0.1:8088/demo/configBo,得到的效果如下:
可以发现,这两种注解方式得到的效果是相同的。
注意:不要对同一个配置信息,引入两次。因为spring的加载机制是采用反射扫描的发现机制,在探测到Spring容器中有一个org.springframework.beans.factory.config.PropertyPlaceholderConfigurer的Bean就会停止对剩余PropertyPlaceholderConfigurer的扫描(Spring 3.1已经使用PropertySourcesPlaceholderConfigurer替代PropertyPlaceholderConfigurer了),所以根据加载的顺序,配置的第二个property-placeholder就被没有被spring加载,想引入的属性就不会被引入了。