Java 在spring引导中加载上下文配置

Java 在spring引导中加载上下文配置,java,spring,spring-boot,Java,Spring,Spring Boot,我有一个SpringBoot应用程序,它使用国家/地区的配置文件。配置文件的结构相同,但不同国家/地区的值不同 我在参考资料目录中为每个国家创建了一个目录,并将该国家的配置文件放在那里 根据传入请求参数的国家代码,我想使用相应的配置文件。spring boot实现这一点的惯用方法是什么(除了使用snakeyaml之类的工具手动加载yaml配置文件之外) 谢谢您可以为每个国家/地区使用Spring@Profile。见和 Spring概要文件提供了一种分离应用程序部分的方法 配置并使其仅在某些环境中

我有一个SpringBoot应用程序,它使用国家/地区的配置文件。配置文件的结构相同,但不同国家/地区的值不同

我在参考资料目录中为每个国家创建了一个目录,并将该国家的配置文件放在那里

根据传入请求参数的国家代码,我想使用相应的配置文件。spring boot实现这一点的惯用方法是什么(除了使用snakeyaml之类的工具手动加载yaml配置文件之外)


谢谢

您可以为每个国家/地区使用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");