Spring framework Day16:@PropertySource注解使用

前言

在开发应用程序过程中,经常需要使用外部的属性文件来配置应用程序的行为。Spring框架提供了@PropertySource注解,它可以方便地加载外部的属性文件,并将其中定义的属性值注入到Spring配置中。使用@PropertySource注解,我们可以灵活地管理和维护应用程序的配置信息,提高可维护性和灵活性。

本文将介绍@PropertySource注解的使用方法,以及如何将外部的属性文件加载到Spring配置中。我们将通过一个简单的示例来演示整个过程,并说明一些注意事项。

接下来,我们将详细介绍如何使用@PropertySource注解来加载外部属性文件。让我们开始吧!

一、开始学习

1、新建项目,结构如下
2、添加 spring 依赖
XML 复制代码
 
    <!-- spring 的核心依赖 -->
    <dependencies>
        <!-- https://mvnrepository.com/artifact/org.springframework/spring-context -->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-context</artifactId>
            <version>5.3.23</version>
        </dependency>
 
        <dependency>
            <groupId>ch.qos.logback</groupId>
            <artifactId>logback-classic</artifactId>
            <version>1.4.5</version>
        </dependency>

         <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.33</version>
        </dependency>
 
    </dependencies>
3、 在 resources 下新建一个 db:properties 文件
java 复制代码
url = jdbc:mysql://localhost:3306/psm
driver = com.mysql.cj.jdbc.Driver
name = root
password = 123456
4、在 config 包下新建一个 AppConfig 配置类
java 复制代码
/**
 * @Date 2023-10-10
 * @Author qiu
 */
@Configuration
@PropertySource("classpath:db.properties")
@Slf4j
public class AppConfig {

    /**
     * 使用 @Value 注解结合 spel 表达式进行值注入,也就是将 properties
     * 文件中的属性值注入到当前的字段中
     */
    @Value("${driver}")
    private String driver;
    @Value("${url}")
    private String url;
    @Value("${name}")
    private String userName;
    @Value("${password}")
    private String password;

    @Bean
    public Connection connection() {
        log.info(driver);
        log.info(url);
        log.info(userName);
        log.info(password);

        try {
            return DriverManager.getConnection(url, userName, password);
        } catch (SQLException e) {
            throw new RuntimeException("Get connection error", e);
        }
    }

}

注意: 将 properties 文件的属性注入到配置类的字段中,由于 properties 文件是放在 resources 目录下, 因此编译之后会保存在 classpath 目录下,因此需要从 classpath 路径中查找资源文件

这段代码是一个配置类 AppConfig,用于将 properties 文件中的属性值注入到字段中,并创建一个数据库连接。

注解 @PropertySource("classpath:db.properties") 指定了 db.properties 文件位于 classpath 路径下,用于读取属性值。

通过 @Value 注解结合 SpEL 表达式,可以将 properties 文件中的属性值注入到对应的字段中。例如,@Value("${driver}") 表示将 db.properties 中的 driver 属性值注入到 driver 字段中。

connection() 方法中,通过 DriverManager.getConnection() 方法创建数据库连接,使用从 properties 文件中注入的属性值。

最后,使用日志打印了 driverurluserNamepassword 字段的值。

在配置类中使用到了两个注解:

  1. @PropertySource 注解用于指定属性文件的位置,并将其加载到 Spring 的环境中。它可以被用于类级别和方法级别。
  2. @Value 注解用于将属性值注入到类的字段或方法参数中。它可以用来获取属性文件中定义的属性值,也可以使用 SpEL 表达式进行动态赋值。
5、测试
java 复制代码
@Slf4j
public class Main {

    public static void main(String[] args) {
        ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        Connection bean = context.getBean(Connection.class);
        Connection bean2 = context.getBean(Connection.class);
        log.info("con1:" + bean);
        log.info("con2:" + bean2);
    }

}

运行结果

二、使用 @PropertySource 和 @Value 注解的好处

使用@PropertySource@Value注解的主要好处在于可以统一管理应用程序中的属性值,并将其注入到类的字段或方法参数中,从而提高了应用程序的可配置性和可维护性。具体来说,有以下几点好处:

  1. 方便地读取属性文件中的属性值。 @PropertySource 注解可以将外部属性文件中的属性值加载到 Spring 应用程序上下文中,而 @Value 注解则可以方便地读取属性文件中的属性值,并将其注入到类的字段或方法参数中。这样,就不需要手动去读取属性文件,也不需要硬编码属性值,从而降低了代码的耦合度。

  2. 实现多环境配置。 在不同的环境中,可能需要设置不同的属性值,例如数据库连接地址等。通过在不同的环境中配置不同的属性文件,可以灵活地管理属性值,提高了应用程序的可配置性和可维护性。

  3. 提高代码的复用性。 配置类中的@Bean注解方法可以通过@Value注解获取属性值,并实现对组件的注入,从而使得组件可以被复用。

  4. 方便地进行测试。 由于通过属性注入的方式,相关的对象可以解耦合,因此便于进行单元测试。

总之,使用 @PropertySource@Value 注解可以方便地统一管理应用程序中的属性值,并将其注入到类的字段或方法参数中,从而提高了应用程序的可配置性和可维护性。

三、gitee 案例

案例完整地址:https://gitee.com/qiu-feng1/spring-framework.git

相关推荐
腻害兔2 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社3 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖4 小时前
JDK 26 新特性详解
java·开发语言
Database_Cool_4 小时前
OLTP 和 OLAP 区别详解:分析型数据库和事务型数据库怎么选(附阿里云 AnalyticDB MySQL 选型指南)
数据库·mysql·阿里云
马优晨4 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
Database_Cool_5 小时前
单机 MySQL 迁移到分布式数据库方便吗?阿里云 PolarDB-X 100% MySQL 协议兼容零改造平滑迁移
数据库·分布式·mysql
姜太小白5 小时前
【MySQL】 索引优化实战:解决 WHERE 等值 + IS NULL 查询,TEXT 字段报错 1167 的完整指南
数据库·mysql
liuxiaowei37 小时前
【绝版教程】新版MySQL DBA高级实战进阶班 MySQL8.0 姜承尧-腾讯数据库总监
数据库·mysql·dba
维天说7 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane19948 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端