Java 如何传递Spring';s@PropertySource注释?

Java 如何传递Spring';s@PropertySource注释?,java,spring,spring-boot,maven,Java,Spring,Spring Boot,Maven,说明: 作为测试开发人员,我希望在执行测试之前选择一个特定的属性文件 问题: 如何在命令行中调用所需的属性 我正在使用mvn构建我的项目 创意: 我在想这样的事情: ~mvn clean verify-Dproperty.source.project1=QA1-Dproperty.source.project2=QA2 最好在命令行中处理多个属性选择(如上面的行),因为此项目将有多个“PropertyController” 代码: package com.core.propertycontrol

说明:

作为测试开发人员,我希望在执行测试之前选择一个特定的属性文件

问题:

如何在命令行中调用所需的属性

我正在使用
mvn
构建我的项目

创意:

我在想这样的事情:

~mvn clean verify-Dproperty.source.project1=QA1-Dproperty.source.project2=QA2

最好在命令行中处理多个属性选择(如上面的行),因为此项目将有多个
“PropertyController”

代码:

package com.core.propertycontroller;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.context.support.PropertySourcesPlaceholderConfigurer;

@Configuration
@PropertySource("classpath:application-${env}.properties")
//This project will have Project2PropertyLoader.class, and so on and so forth.
public class Project1PropertyLoader {

    public Project1PropertyLoader() { super();}

    @Bean
    public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }
}
我正在使用
@ContextConfiguration
加载这个类

package com.testrunners;

import com.core.propertycontroller.Project1PropertyLoader;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.core.env.Environment;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.support.AnnotationConfigContextLoader;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(classes = { Project1PropertyLoader.class } , loader = AnnotationConfigContextLoader.class)
public class EnvironmentTest {

    @Autowired
    private Environment environment;

    @Value("${sample.url}")
    private String url;

    @Test
    public void printUrl() {
        System.out.println("Project1PropertyLoader Url via @Value " + url);
        System.out.println("Project1PropertyLoader Url via Environment " + environment.getProperty("sample.url"));
    }
}
应用程序-QA1.1属性

sample.url=https://hello.com

应用程序-QA2.2属性

sample.url=https://world.com

更新: 也欢迎其他解决办法。我洗耳恭听。
谢谢

既然您将文件命名为
application-${env}.properties
,您应该只使用Spring Boot的内置“profile”功能

请参阅第节第章,其中列出:

  • 在打包的jar之外(
    application-{profile}.properties
    和YAML变体)

  • 打包在jar中(
    application-{profile}.properties
    和YAML变体)

  • 和第章,其中说(意译):

    可以使用以下开关在命令行上指定配置文件:

    --spring.profiles.active=QA1


    阅读上面链接的两章的文档,了解有关此强大功能的更多信息。

    或者,您可以如下设置属性的默认值

    @Value("${some.key:stackoverflow.com}")
    private String url;
    

    在上面的示例中,如果没有提供url,stackoverflow.com将是有效的。

    编译器在编译时评估RetentionPolicy.RUNTIME注释的注释元数据,因此无法在运行时动态更改。您可以使用“令牌”模板并将文件另存为.template,根据mvn命令,生成一个具有正确注释属性值的java文件,然后编译它。您可以使用spring评测,并在SpringBootTest类中放置注释“@ActiveProfiles”“通过指定所需的环境,例如dev、qa或test.profile依赖于
    应用程序.properties
    文件,这将假定您只有
    1
    项目
    1
    属性类加载器。不或者,即使在同时调用多个环境的情况下,这也能起作用吗?@GheenoSanPascualIII不,配置文件完全独立于属性。它们是相关的,因为Spring Boot将尝试使用所示的命名约定加载特定于概要文件的属性文件。但是概要文件也可以通过使用注释来控制SpringBean是否可用属性和配置文件都由Spring
    ApplicationContext
    管理,因此不限于
    1
    Project
    1
    属性类加载器。