普通属性注入
由于Spring Boot源自Spring,所以Spring中存在的属性注入,在Spring Boot中一样也存在。由于Spring Boot中,默认会自动加载application.properties文件,所以简单的属性注入可以直接在这个配置文件中写。
例如,创建Book类
@Component
public class Book {
@Value("${book.id}")
private Long id;
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
'}';
}
}
在application.properties文件中定义属性:
book.name=三国演义
book.author=罗贯中
book.id=99
按照传统的方式(Spring中的方式),可以直接通过@Value注解将这些注解注入到Book对象中:
@Component
public class Book {
@Value("${book.id}")
private Long id;
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
//省略getter和setter
注意:
Book对象本身也要交给Spring容器去管理,如果Book没有交给Spring容器,那么Book中的属性也无法从Spring容器中获取到值。
配置完成后,在Controller或者单元测试中注入Book对象,启动项目,就可以看到属性已经注入到对象中了。
一般来说,我们在application.properties文件中主要存放系统配置,这种自定义配置不建议放在该文件中,可以自定义properties文件来存放自定义配置。
例如在resources目录下,自定义book.properties文件,内容如下:
book.name=三国演义
book.author=罗贯中
book.id=99
此时,项目启动时不会自动的加载该配置文件,如果是在xml配置中,可以通过如下方法引用该properties文件:
<context:property-placeholder location="classpath:book.properties"/>
如果是在Java配置中,可以通过@PropertySource来引入配置:
@Component
@PropertySource("classpath:book.properties")
public class Book {
@Value("${book.id}")
private Long id;
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
//省略getter和setter
这样,当项目启动时,就会自动加载book.properties文件。这只是Spring中属性注入的一个简单用法,和Spring Boot没有关系。
类型安全的属性注入
Spring Boot引入了类型安全的属性注入,如果采用Spring中的配置方式,当配置的属性非常多的时候,工作量就很大了,而且容易出错。
使用类型安全的属性注入,可以有效的解决这个问题:
@Component
@PropertySource("classpath:book.properties")
@ConfigurationProperties(prefix = "book")
public class Book {
private Long id;
private String name;
private String author;
//省略getter和setter
这里,主要是引入@ConfigurationProperties(prefix = “book”)注解,并且配置了属性的前缀,此时会自动将Spring容器中对应的数据注入到对象对应的属性中,就不用通过@Value注解挨个注入了,减少工作量并且避免出错。
数组注入
yaml也支持数组注入,例如:
my:
servers:
- dev.example.com
- another.example.com
这段数据可以绑定到一个带Bean的数组中:
@ConfigurationProperties(prefix="my")
@Component
public class Config {
private List<String> servers = new ArrayList<String>();
public List<String> getServers() {
return this.servers;
}
}
项目启动后,配置中的数组会自动存储到servers集合中。当然,yaml不仅可以存储这种简单数据,也可以在集合中存储对象。例如下面这种:
redis:
redisConfigs:
- host: 192.168.66.128
port: 6379
- host: 192.168.66.129
port: 6380
这个可以被注入到如下类中:
@Component
@ConfigurationProperties(prefix = "redis")
public class RedisCluster {
private List<SingleRedisConfig> redisConfigs;
//省略getter/setter
}