简单学习Spring属性注入和SpringBoot配置文件

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 的冒号后面一定要加一个空格

参考文献:

ps:如有错误,欢迎批评指正,谢谢

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

leeindex

感谢您的鼓励~~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值