了解过spring-Boot这个技术的,应该知道Spring-Boot的核心配置文件application.properties,当然也可以通过注解自定义配置文件的信息。
pom文件
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <!-- 单元测试使用 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot</artifactId> <version>1.5.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>1.5.6.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-autoconfigure</artifactId> <version>1.5.6.RELEASE</version> </dependency> </dependencies>
Spring-Boot读取配置文件的方式:
一.读取核心配置文件信息application.properties的内容
核心配置文件是指在resources根目录下的application.properties或application.yml配置文件,读取这两个配置文件的方法有两种,都比较简单。
核心配置文件application.properties内容如下:
test.msg=Hello World SpringBoot test.name=test test.password= 123test
方式一:使用@Value方式(常用)
package cn.ar.controller; import org.springframework.beans.factory.annotation.Value; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Map; /** * Created with IntelliJ IDEA. * User: Jayden * Date: 2018/6/28 * Time: 9:57 */ @RestController
//@PropertiesSource("classpath:application.properties") public class FirstController { @Value("${test.name}") private String name; @Value("${test.password}") private String password; @RequestMapping(value = "/test") public String say(){ return name+":application.propertoes里面的name值"+"/t"+password+"密码"; } }
注意:1.在@Value的${}中包含的是核心配置文件中的键名。在Controller类上加@RestController表示将此类中的所有视图都以JSON方式显示,类似于在视图方法上加@ResponseBody。
2.@PropertySource配置文件路径设置,在类上添加注解,如果在默认路径下可以不添加该注解 ,我这里就在默认路径下,所以上面没用这个注解。
如果有多及目录, 比如 classpath:config/my.properties指的是src/main/resources目录下config目录下的my.properties文件.
3.多配置文件引用,若取两个配置文件中有相同属性名的值,则取值为最后一个配置文件中的值:
比如:@PropertySource({"classpath:config/my.properties","classpath:config/config.properties"})
访问:http://localhost:8080/test时得到:"方式一:test:application.propertoes里面的name值/t123test密码"
方式二:使用Environment方式
package cn.ar.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.core.env.Environment; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import java.util.Map; /** * Created with IntelliJ IDEA. * User: Jayden * Date: 2018/6/28 * Time: 9:57 */ @RestController public class FirstController { /* @Value("${test.name}") private String name; @Value("${test.password}") private String password; @RequestMapping(value = "/test") public String say(){ return name+":application.propertoes里面的name值"+"/t"+password+"密码"; }*/ @Autowired private Environment env; @RequestMapping(value = "/test") public String say(){ return env.getProperty("test.name") + " " +env.getProperty("test.password"); } }
注意:这种方式是依赖注入Evnironment来完成,在创建的成员变量private Environment env上加上@Autowired注解即可完成依赖注入,然后使用env.getProperty("键名")即可读取出对应的值。
二.读取自定义配置文件信息,例如:detifalManager.properties
- 首先建立对象与配置文件映射关系
- 方法中使用自动注入方式,将对象注入,调用get方法获取属性值
- 注意:新版本的@ConfigurationProperties没有了location属性,使用@PropertySource来指定配置文件位置
- prefix=”user1”指的是配置文件中的前缀,如user1.name,在定义对象属性名时为private String name;
- 读取配置文件中的集合时,使用List来接收数据,但List必须先实例化,负责会报错
为了不破坏核心文件的原生态,但又需要有自定义的配置信息存在,一般情况下会选择自定义配置文件来放这些自定义信息,这里在resources
目录下创建配置文件detifalManager.properties
resources/detifalManager.properties
内容如下:
user1.name=admin11111111 user1.password=admin123qwqwq user1.age= 15 user1.sex=男
创建管理配置的实体类:
package cn.ar.controller; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.PropertySource; import org.springframework.stereotype.Component; /** * Created with IntelliJ IDEA. * User: Jayden * Date: 2018/6/28 * Time: 10:24 */ @Component//加上注释@Component,可以直接在其他地方使用@Autowired来创建其实列对象 @ConfigurationProperties(prefix = "user1")//设置配置文件的前缀 @PropertySource("classpath:detifalManager.properties")//设置自定义文件的路径 public class Manager { private String name; private String password; private String sex; private int age; public String getName() { return name; } public void setName(String name) { this.name = name; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getSex() { return sex; } public void setSex(String sex) { this.sex = sex; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } }
注意:
在@ConfigurationProperties注释中有两个属性:
新版的springboot 没有这个属性:locations:指定配置文件的所在位置,可以使用@propertySource("classpath:****")指定
prefix:指定配置文件中键名称的前缀(我这里配置文件中所有键名都是以user1.开头)
使用@Component是让该类能够在其他地方被依赖使用,即使用@Autowired注释来创建实例。
创建测试Controller
package cn.ar.controller; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * Created with IntelliJ IDEA. * User: Jayden * Date: 2018/6/28 * Time: 10:33 */ @RestController public class SecondController { @Autowired Manager manager; @RequestMapping("/test1") public String say(){ return "name"+ manager.getName() + "password" + manager.getPassword(); } }
注意:由于在manager类上加了注释@Component,所以可以直接在这里使用@Autowired来创建其实例对象。
访问:http://localhost:8080/test1时得到:"name admin11111111 password admin123qwqwq"