普通的属性注入
由于 Spring Boot 源自 Spring ,所以 Spring 中存在的属性注入,在 Spring Boot 中一样也存在。由于 Spring Boot 中,默认会自动加载 application.properties 文件,所以简单的属性注入可以直接在这个配置文件中写。
例如,现在定义一个 Book 类:
public class Book {
private String name;
private String author;
private int id;
//省略 getter/setter
然后,在 application.properties 文件中定义属性:
book.name=西游记
book.author=吴承恩
book.id=99
按照传统的方式(Spring中的方式),可以直接通过 @Value 注解将这些属性注入到 Book 对象中:
@Component
public class Book {
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
@Value("${book.id}")
private int id;
//省略getter/setter
我们使用springboot的单元测试测试一下(单元测试在项目启动的时候也会执行,不需要我们自己启动执行);
@SpringBootTest
class PropertiesApplicationTests {
@Autowired
private Book book;
@Test
void contextLoads() {
System.out.println(book);
}
}
测试结果:
我们发现属性虽然已经注入,但是有中文乱码,像这种问题都是因为编码和解码的不一致导致的,Idea默认的字符集编码是UTF-8,而properties是ASCII码。因此需要调节编码。需要处理一下,打开File-Setting-Editor-File Encodings,设置如下:
更改设置后properties中为中文将乱码,然后重新将内容修改为中文:
:
重启一下工程,属性已注入,编码正常:
注意:
Book 对象本身也要交给 Spring 容器去管理,如果 Book 没有交给 Spring 容器,那么 Book 中的属性也无法从 Spring 容器中获取到值。
一般来说,我们在 application.properties 文件中主要存放系统配置,这种自定义配置不建议放在该文件中,可以自定义 properties 文件来存在自定义配置。
例如在 resources 目录下,自定义 book.properties 文件,内容如下:
book.name=三国演义
book.author=罗贯中
book.id=1
此时,项目启动并不会自动的加载该配置文件,如果是在 XML 配置中,可以通过如下方式引用该 properties 文件:
<context:property-placeholder location="classpath:book.properties"/>
如果是在 Java 配置中,可以通过 @PropertySource 来引入配置:
@Component
@PropertySource("classpath:book.properties")
public class Book {
@Value("${book.name}")
private String name;
@Value("${book.author}")
private String author;
@Value("${book.id}")
private int id;
//省略getter/setter
这样,当项目启动时,就会自动加载 book.properties 文件,效果和上面一样:
注意:
这里用到的@Value和@PropertySource注解都是Spring的注解,和 Spring Boot 没有任何关系。
类型安全的属性注入
Spring Boot 引入了类型安全的属性注入,如果采用 Spring 中的配置方式,当配置的属性非常多的时候,工作量就很大了,而且容易出错。
使用springboot提供的类型安全的属性注入,可以有效的解决这个问题。
@Component
@PropertySource("classpath:book.properties")
@ConfigurationProperties(prefix = "book")
public class Book {
private String name;
private String author;
private int id;
//省略getter/setter
这里,主要是引入 @ConfigurationProperties(prefix = “book”) 注解,并且配置了属性的前缀,此时会自动将 Spring 容器中对应的数据注入到对象对应的属性中,就不用通过 @Value 注解挨个注入了,减少工作量并且避免出错。
效果和上面一样: