Spring @PropertySources 值不被覆盖

作者:编程家 分类: spring 时间:2025-07-22

使用Spring框架开发应用程序时,我们经常需要在配置文件中设置一些属性值,例如数据库连接信息、缓存配置等。Spring提供了@PropertySource注解来读取外部配置文件中的属性值,并将其注入到对应的Bean中。然而,在实际应用中,我们可能需要在不同的环境下使用不同的配置文件,而且有时候我们希望某些属性值不被覆盖。那么,如何实现这样的需求呢?本文将介绍如何使用Spring的@PropertySources注解来实现属性值不被覆盖的功能。

什么是@PropertySources注解

在介绍@PropertySources注解之前,我们先来了解一下@PropertySource注解。@PropertySource注解用于指定外部配置文件的位置,它可以放在Java类上或者方法上。当我们在配置文件中使用相同的属性名时,后面加载的配置文件会覆盖前面加载的配置文件中的属性值。这在某些场景下是非常有用的,但有时候我们希望某些属性值不被覆盖,而是使用第一个加载的配置文件中的值。这就是@PropertySources注解的作用所在。

@PropertySources注解是Spring 4.3版本引入的,它可以用来指定多个@PropertySource注解。通过使用@PropertySources注解,我们可以加载多个配置文件,并且其中的属性值不会被覆盖。

案例代码

为了演示@PropertySources注解的使用,下面我们来创建一个简单的Spring Boot应用程序。首先,我们需要在pom.xml文件中添加相关的依赖:

xml

org.springframework.boot

spring-boot-starter

然后,我们创建一个名为"application.properties"的配置文件,并在其中添加以下属性:

properties

# application.properties

name=John Doe

age=30

接下来,我们创建一个名为"ApplicationConfig"的Java类,并使用@PropertySources注解来加载两个配置文件:

java

@Configuration

@PropertySources({

@PropertySource("classpath:application.properties"),

@PropertySource("classpath:custom.properties")

})

public class ApplicationConfig {

@Value("${name}")

private String name;

@Value("${age}")

private int age;

// 省略其他代码

}

在上面的代码中,我们使用@PropertySources注解加载了两个配置文件,分别是"classpath:application.properties"和"classpath:custom.properties"。其中,"application.properties"是默认的配置文件,而"custom.properties"是自定义的配置文件。注意,如果两个配置文件中存在相同的属性名,后加载的配置文件中的属性值会覆盖前面加载的配置文件中的属性值。

最后,我们可以在Spring Boot应用程序的入口类中使用ApplicationConfig类中定义的属性值:

java

@SpringBootApplication

public class Application {

@Autowired

private ApplicationConfig config;

public static void main(String[] args) {

SpringApplication.run(Application.class, args);

}

@PostConstruct

public void init() {

System.out.println("Name: " + config.getName());

System.out.println("Age: " + config.getAge());

}

}

在上面的代码中,我们通过@Autowired注解将ApplicationConfig类注入到Application类中,并在@PostConstruct注解的方法中打印属性值。

属性值不被覆盖

在上述案例代码中,我们加载了两个配置文件,并且它们中的属性值是不同的。如果我们在"custom.properties"文件中定义了与"application.properties"文件中相同的属性名,那么后加载的配置文件中的属性值会覆盖前面加载的配置文件中的属性值。为了演示属性值不被覆盖的情况,我们可以在"custom.properties"文件中添加以下属性:

properties

# custom.properties

name=Jane Smith

当我们运行应用程序时,可以看到输出结果如下:

Name: John Doe

Age: 30

从上述输出结果可以看出,尽管我们在"custom.properties"文件中定义了"name"属性,并且它的值为"Jane Smith",但是最终打印的属性值仍然是"application.properties"文件中定义的值,即"John Doe"。

通过使用Spring的@PropertySources注解,我们可以加载多个配置文件,并且其中的属性值不会被覆盖。这在某些场景下非常有用,特别是当我们需要在不同的环境下使用不同的配置文件时。在实际应用中,我们可以灵活地使用@PropertySources注解来满足各种需求,并且确保属性值不会被覆盖。

以上就是关于Spring @PropertySources注解以及属性值不被覆盖的介绍和案例代码。希望本文能够帮助大家理解和使用@PropertySources注解,实现属性值不被覆盖的功能。