SpringBoot中的属性注入

SpringBoot中的属性注入

2019.09.08


本文用于记录SpringBoot对组件的属性注入,实现的方式又两种,一种是在SpringMVC中就已经支持的@Value配合@Component与@PropertySource方式;另一种则是本文将要着重记录的SpringBoot特有的类型安全的属性注入。
本文将从以下两个点记录:

1、原有的属性注入方式
2、类型安全的属性注入


原有的属性注入方式

  • 工程结构
    SpringBoot中的属性注入_第1张图片

  • Book.java

@Component
@PropertySource("classpath:/book.properties")
public class Book {

    @Value("${book.id}")
    private Integer 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 Integer getId() {
        return id;
    }

    public void setId(Integer 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;
    }
}
  • book.properties
# 自定义组件的属性注入
book.id=1
book.name=三国演绎
book.author=罗贯中

既然是属性注入,就是将组件交给spring容器,再告诉容器这个组件的属性配置文件的位置,然后让容器自动将配置文件中的属性值与组件中的属性一一配对注入。因此我们不难理解上图中Book类中为什么要用到@Component、@PropertySource以及@Value这三个注解。
@Component:将需要属性注入的Book组件交给spring容器。
@PorpertySource:告诉spring容器Book组件的属性配置文件在哪。
@Value:将Book组件中的属性与配置文件中的属性值一一对应注入。

类型安全的属性注入

  • User.java
@Component
@PropertySource("classpath:/user.properties")
@ConfigurationProperties(prefix = "user")
public class User {

    private Integer id;
    private String username;
    private String password;

    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                '}';
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}
  • user.properties
# 自定义组件的安全属性注入
user.id=1
user.username=root
user.password=root

这种方式是springboot特有的类型安全的属性注入。首先将需要属性注入的组件交给springboot容器管理,再告诉容器属性配置文件的位置,值得注意的是我们舍弃了@Value的手动注入,而是用@ConfigurationProperties注解指定属性文件中的属性的前缀,通过这个前缀自动索引到属性名,然后匹配组件中的属性名再注入属性值。

对以上两种属性注入方式的测试代码如下:

  • PropertiesApplicationTests.java
@RunWith(SpringRunner.class)
@SpringBootTest
public class PropertiesApplicationTests {

    @Autowired
    Book book;
    @Autowired
    User user;

    @Test
    public void contextLoads() {
        System.out.println(book);
        System.out.println(user);
    }

}

感谢阅读!

你可能感兴趣的:(springboot)