一、什么叫类型安全的属性注入
在此之前,需要了解一下什么叫属性注入,可以参考我的上一篇博客,讲的就是属性注入,参考链接如下:
Spring属性注入
二、为什么需要类型安全
首先,我们需要考虑如下两个问题:
1.若该对象有100+个属性,这样写,代码是否太过复杂和冗余?
2.我们都知道属性是需要私有化的,行为才公开化,这样写,代码是否缺少安全性?
三、解决类型安全的方法
解决办法如下:
1.在Book.java上添加如下注解:
@ConfigurationProperties(prefix = "book")
注:注释或删除原属性上的@Value注解
解释一下原理:
@ConfigurationProperties(prefix = “book”)注解的prefix属性对应的值和xxx.properties文件中的book.xxx属性对应,所以我们再定义其他属性时,只需要将属性的名字和xxx.properties文件中的book.xxx对应即可,这样我们就减少了写代码的工作量和提升了类型的安全性,也契合“属性私有化”这一原则。
举例:
1.参考上一篇文章,只需要修改Book.java即可,代码如下:
package com.mango.properties;
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;
@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;
}
}
2.运行结果:
Book{id=1, name='三国演义', author='罗贯中'}