Java Spring引导,从不同的属性文件填充两个相等的组件类
我的spring启动应用程序有问题。 应用程序使用saml与其他服务器通信。因此,我有一个带有组件注释的类,用于从自定义属性文件(而不是从application.properties)中读取一些属性,以获取url等通信信息。 我不允许发布真实代码,因此这是伪代码中的一个示例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
@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一个限定符来标识吗?