@ConfigurationProperties注解
这个注解用于从配置文件中取值,如下通过在实体类上添加@ConfigurationProperties同时写上前缀myuser,使用的时候需要通过@Autowired注入然后才能看到读取了配置文件值
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private User user;
@GetMapping("/test")
public User test() {
System.out.println(user);
return user;
}
}
@Component
@ConfigurationProperties(prefix = "myuser")
public class User {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}
就可以读取配置文件的如下值
myuser.name=张三
myuser.age=20
中文乱码
但可能会出现乱码的情况,如下,这是因为Spring Boot注解读取application.properties或者application-{profile}.properties文件时默认的是ISO_8859_1编码,不管是@ConfigurationProperties注解还是@Value注解都会出现这种情况
解决方法有两种
- 使用yml配置文件进行配置。Spring Boot在读取yaml配置文件时使用的是UTF-8的编码方式
- 使用自定义配置文件,使用@PropertySource,如下,classpath表示的路径是resources目录,编码为GBK,取决于你自己的配置文件编码
@Component
@ConfigurationProperties(prefix = "myuser")
@PropertySource(value = "classpath:myconfig.properties", encoding = "GBK")
public class User {
private String name;
private String age;
注意
@ConfigurationProperties注解使用setter方法来注入值的,如果删除User类的setter方法,如下,则可以读取配置文件属性,但是无法赋值给User对象,可以删除setAge,留下setName看效果,启动会直接报错
@Component
@ConfigurationProperties(prefix = "myuser")
@PropertySource(value = "classpath:myconfig.properties", encoding = "GBK")
public class User {
private String name;
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
在类方法上使用
这里要注意的是,虽然getUser()也在Controller类中,但是不能直接调用getUser,因为如果直接调用getUser获取的User是不受IOC容器管理的,所以需要使用@Bean注解,将User对象注入到IOC容器中,再使用@Autowired来获取该对象,才能看到读取了配置文件并赋值
@RestController
@RequestMapping("/test")
public class TestController {
@Autowired
private User user;
@GetMapping("/test")
public User test() {
// return getUser();
return user;
}
@ConfigurationProperties(prefix = "myuser")
@Bean
public User getUser() {
return new User();
}
}
@Value注解
- @Value和@ConfigurationProperties类似都只指定配置文件中的值和对象中的值的映射关系,都可以使用@PropertySource来指定特定的配置文件,但是@Value注解还支持SPEL表达式,@Configuration不支持
- 和@ConfigurationProperties一样,如果去掉setter方法则项目无法启动
@Component
//@ConfigurationProperties(prefix = "myuser")
@PropertySource(value = "classpath:myconfig.properties", encoding = "GBK")
public class User {
@Value("${myuser.name}")
private String name;
@Value("${myuser.age}")
private String age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;
}
@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", age='" + age + '\'' +
'}';
}
}