在spring boot中加载上下文配置

时间:2017-09-10 06:29:05

标签: java spring spring-boot

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

我已在资源目录中为每个国家/地区创建了一个目录,并将该国家/地区的配置文件放在那里。

根据请求参数中传递的国家/地区代码,我想使用相应的配置文件。什么是弹簧启动惯用的方法(除了使用像snakeyaml手动加载yaml配置文件)?

由于

2 个答案:

答案 0 :(得分:6)

您可以通过为MessageSourceLocaleResolverLocaleChangeInterceptor bean创建bean来实现,然后将LocaleChangeInterceptor添加到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());
        }
    }

然后在country-conf文件夹中创建一个文件夹 - resources。在此文件夹中创建将具有您的配置的属性文件。例如:

country.properties(默认)

country.name=United states

<强> country_fr.properties

country.name=France
如果参数中未发送国家/地区,则

country.properties是默认属性,如果您在参数中发送country=fr,则会查找country_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");

答案 1 :(得分:2)

您可以为每个国家/地区使用Spring @Profile。请参阅examplesdocs

  

Spring Profiles提供了一种隔离应用程序部分的方法   配置并使其仅在某些环境中可用。任何   @Component或@Configuration可以用@Profile标记以限制何时   它已加载:

您可以在运行时添加配置文件:

AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.getEnvironment().setActiveProfiles("za");