Java 在spring引导中加载上下文配置
我有一个SpringBoot应用程序,它使用国家/地区的配置文件。配置文件的结构相同,但不同国家/地区的值不同 我在参考资料目录中为每个国家创建了一个目录,并将该国家的配置文件放在那里 根据传入请求参数的国家代码,我想使用相应的配置文件。spring boot实现这一点的惯用方法是什么(除了使用snakeyaml之类的工具手动加载yaml配置文件之外)Java 在spring引导中加载上下文配置,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个SpringBoot应用程序,它使用国家/地区的配置文件。配置文件的结构相同,但不同国家/地区的值不同 我在参考资料目录中为每个国家创建了一个目录,并将该国家的配置文件放在那里 根据传入请求参数的国家代码,我想使用相应的配置文件。spring boot实现这一点的惯用方法是什么(除了使用snakeyaml之类的工具手动加载yaml配置文件之外) 谢谢您可以为每个国家/地区使用Spring@Profile。见和 Spring概要文件提供了一种分离应用程序部分的方法 配置并使其仅在某些环境中
谢谢您可以为每个国家/地区使用Spring
@Profile
。见和
Spring概要文件提供了一种分离应用程序部分的方法
配置并使其仅在某些环境中可用。任何
@组件或@Configuration可以标记为@Profile以限制
它被加载到:
您可以在运行时添加配置文件:
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
ctx.getEnvironment().setActiveProfiles("za");
您可以通过为
MessageSource
、LocaleResolver
和localechangereinterceptor
bean创建bean来实现,然后将localechangereinterceptor
添加到InterceptorRegistry
,如下所示:
@Configuration
public class CountryConfig extends WebMvcConfigurerAdapter{
@Bean
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasenames("classpath:country-conf/country");
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setDefaultEncoding("UTF-8");
messageSource.setCacheSeconds(3600);
return messageSource;
}
@Bean
public LocaleResolver localeResolver() {
SessionLocaleResolver slr = new SessionLocaleResolver();
slr.setDefaultLocale(Locale.US);
return slr;
}
@Bean
public LocaleChangeInterceptor localeChangeInterceptor() {
LocaleChangeInterceptor lci = new LocaleChangeInterceptor();
lci.setParamName("country");
return lci;
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(localeChangeInterceptor());
}
}
然后在resources
文件夹中创建一个文件夹-country conf
。在此文件夹中创建属性文件,该文件将包含您的配置。例:
country.properties(默认)
国家/地区物业
country.name=France
country.properties
是默认属性,如果在参数中未发送任何国家,并且如果在参数中发送country=fr
,则它将查找country\u fr.properties
文件
现在创建一个服务,该服务将根据国家参数从这些属性文件中获取值
@Service
public class CountryService {
@Autowired
private MessageSource messageSource;
public String getMessage(String code) {
Locale locale = LocaleContextHolder.getLocale();
return this.messageSource.getMessage(code, null, locale);
}
}
要测试此autowire国家/地区服务
@Autowired
CountryService countryService;
然后调用getMessage方法
countryService.getMessage("country.name");
据我所知,您必须告诉spring boot在启动时加载哪个配置文件(例如,dev、staging、prod等)。在我的例子中,它是基于请求的,例如/getData?countryCode=za、/getData?countryCode=In等,我必须使用适当的配置文件(za/config.yaml和In/config.yaml)为每个请求提供服务。使用配置文件是正确的方法吗?您可以通过编程方式添加它:
AnnotationConfigApplicationContext ctx=newannotationconfigapplicationcontext();ctx.getEnvironment().setActiveProfiles(“za”)代码>
countryService.getMessage("country.name");