Spring属性的注入
Spring 启动时自动加载 application.properties 文件;实际项目开发中,可以自定义配置。
简单示例:(将自定义配置进行属性注入)
- 项目 resources 文件夹下新建 book.properties 文件
book.id=15
book.name=阿里巴巴Java开发手册
book.author=孤尽
- 新建一个类 (Book),并定义三个属性 id 、name 、author
定义属性的 getter / setter 方法和 toString() 方法
public class Book {
private Long id;
private String name;
private String author;
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + 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;
}
}
- (重点)将属性注入到 bean 中
- 使用注解 @Component 将 Book 类注册到 Spring 容器中
- 自定义的配置文件不会自动被加载
- 在 Bean 中使用注解 @PropertySource 指定自定义配置文件
- 类似于 xml 文件中的 placeholder 属性引入数据库配置
- 使用注解 @Value 绑定属性
此时完整的 Book 类代码:
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
@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;
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + 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;
}
}
- 测试:
- 测试类中利用@Autowired 注入 Book ,并在控制台输出
import lee.website.entity.Book;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class WebsiteApplicationTests {
// 自动注入
@Autowired
Book book;
@Test
public void contextLoads() {
System.out.println(book);
}
}
运行结果:
!出现中文乱码 …
△ 解决方案(以 IDEA 为例):
依次打开:File >> Settings >> Editor >> File Encodings
将编码方式统一改为:UTF-8 ,并勾选 Transparent native-to-ascii conversion >> OK
此时自定义的 book.properties 内容会乱码,重新编写。
(补充知识)文件管理器中查看已被转码的原始文件:
项目中右键单击 book.properties >> show in explorer ,打开 book.properties 内容为:
book.id=15
book.name=\u963F\u91CC\u5DF4\u5DF4Java\u5F00\u53D1\u624B\u518C
book.author=\u5B64\u5C3D
完成上述修改后,再次运行: 控制台正常输出
SpringBoot 类型安全的属性注入
上述Spring 属性注入的缺点:
- 如果属性较多,每一个都用 @Value 注入,比较麻烦,不利于后期维护
- 如果某一个属性拼写错误,将报错无法进入
利用 SpringBoot 中新特性解决:
- 利用注解 @ConfigurationProperties() 将自定义配置文件中的的属性自动注入
- 指定自定义配置文件中的属性前缀,例如:prefix = “book”
package lee.website.entity;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.PropertySource;
import org.springframework.stereotype.Component;
/**
* @Author: lee
* @Date: 2020/5/19 15:36
* @Description:
*/
@Component
@PropertySource("classpath:book.properties")
@ConfigurationProperties(prefix = "book")
public class Book {
// @Value("${book.id}")
private Long id;
// @Value("${book.name}")
private String name;
// @Value("${book.author}")
private String author;
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + 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;
}
}
测试运行,控制台正常输出,无异常。
YAML配置(*.yml / *.yaml)和 properties 配置的区别:
yaml 配置是有序的,properties 配置是无序的;
自定义的 yaml 暂时不支持使用注解直接注入到 SpringBoot 项目中;
yaml 文件中用 " : " 进行分割,properties 文件中是用 " . " 进行分割;
yaml 拥有天然的树状结构,数据格式和 json 格式很像,都是 Key-Value格式,通过 " : " 赋值;
yaml 中每个 key 的冒号后面一定要加一个空格