Java Spring引导,从不同的属性文件填充两个相等的组件类

Java Spring引导,从不同的属性文件填充两个相等的组件类,java,spring-boot,properties,Java,Spring Boot,Properties,我的spring启动应用程序有问题。 应用程序使用saml与其他服务器通信。因此,我有一个带有组件注释的类,用于从自定义属性文件(而不是从application.properties)中读取一些属性,以获取url等通信信息。 我不允许发布真实代码,因此这是伪代码中的一个示例 @Component public class A implements ConfigInterface { @Value ("${placeholder1 from properties-File}") private

我的spring启动应用程序有问题。 应用程序使用saml与其他服务器通信。因此,我有一个带有组件注释的类,用于从自定义属性文件(而不是从application.properties)中读取一些属性,以获取url等通信信息。 我不允许发布真实代码,因此这是伪代码中的一个示例

@Component
public class A implements ConfigInterface {

@Value ("${placeholder1 from properties-File}")
private ... value1;
@Value ("${placeholder2 from properties-File}")
private ... value2;

...
}
要使用的控制器如下所示:

@Controller
public class controller {
@Autowired
private ConfigInterface config;

public method ( ... ) {
    ...
    createAMessage(config);
    ...
}
}
我的任务是将类A复制到类B中,并从不同的属性文件加载类似的属性。 这里再举一个例子:

@Component ("classAProperties")
public class A implements ConfigInterface {

@Value ("${placeholder1 from properties-File1}")
private ... value1;
@Value ("${placeholder2 from properties-File1}")
private ... value2;

...
}



@Component ("classBProperties")
public class B implements ConfigInterface {

@Value ("${placeholder1 from properties-File2}")
private ... value1;
@Value ("${placeholder2 from properties-File2}")
private ... value2;

...
}
用法:

@Controller
public class controller {

@Autowired
@Qualifier("classAProperties")
private ConfigInterface configA;

@Autowired
@Qualifier("classBProperties")
private ConfigInterface configA;

public methodA ( ... ) {
    ...
    createAMessage(configA);
    ...
}

public methodB ( ... ) {
    ...
    createAMessage(configB);
    ...
}
}
问题是,如何告诉类A仅从properties-file1加载属性,而类B仅从properties-file2加载属性?我尝试在类A和类B中使用@PropertiesSource注释,但最后它总是在控制器的两个方法中使用类B中的属性

编辑:

这两个属性文件都位于resources文件夹中。 属性文件如下所示:

propertiesA.properties
placeholder1 = URL for destination
placeholder2 = Path to keystore
...

propertiesB.properties
placeholder1 = URL for other destination
placeholder2 = Path to other keystore
...
在类A上可以使用@PropertySource(“classpath:file1.properties”),在类B上可以使用@PropertySource(“classpath:file2.properties”)注释。这可能对你有帮助


此外,如果尚未使用@Configuration annotation,请尝试将其与@PropertySource一起使用。

最简单的方法是使用不同的属性名称。如果失败,我相信您需要删除A和B的
@组件
注释,并使用通过
@Configuration
类初始化bean的替代机制,如下所示:

@Configuration
@PropertySource("propsA")
public class ConfigurationA{

    @Bean
    public ClassA classA(){
        return new ClassA();
    }
}

@Configuration
@PropertySource("propsB")
public class ConfigurationB{

    @Bean
    public ClassB classB(){
        return new ClassB();
    }
}

您可以使用
@ConfigurationProperties
,如下所示:

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix="props.a")
public class A implements ConfigInterface {
  private ... value1;
  private ... value2;
  //getters setters
}

@Component
@EnableConfigurationProperties
@ConfigurationProperties(prefix="props.b")
public class B implements ConfigInterface {
  private ... value1;
  private ... value2;
  //getters setters
}

我已经试过了,但仍然使用第二个属性文件中的属性。这真的有效吗?非
@PropertySource
的API文档应与
@Configuration
类一起使用。是的,它需要与@Configuration一起使用,所以如果A和B是组件而不是配置类,那么它基本上不起作用。可以给@Configuration一个限定符来标识吗?