Spring Boot (八)——属性注入

普通的属性注入

由于 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 注解挨个注入了,减少工作量并且避免出错。

效果和上面一样:
在这里插入图片描述

发布了61 篇原创文章 · 获赞 0 · 访问量 593

猜你喜欢

转载自blog.csdn.net/weixin_44075963/article/details/103795860