gpt4 book ai didi

java - SPRING - 以编程方式创建 MessageSource 并将它们用作 bean

转载 作者:行者123 更新时间:2023-11-30 06:21:07 25 4
gpt4 key购买 nike

我必须以编程方式创建不同的消息源并将它们放入 Bean 中,以便在需要时使用正确的消息源。

应用程序必须有每个客户的消息源,因此我创建了一个配置类

@Configuration
public class MessageSourceConfig implements BeanFactoryAware {

private BeanFactory beanFactory;

@Autowired
private ICompanyService service;

private Map<Company, MessageSource> messageSourceMap = new HashMap<Company, MessageSource>();

// default messageSource
@Bean
@Primary
public MessageSource messageSource() {
ReloadableResourceBundleMessageSource messageSource = new ReloadableResourceBundleMessageSource();
messageSource.setBasename("classpath:messages");
messageSource.setUseCodeAsDefaultMessage(true);
messageSource.setCacheSeconds(5);
messageSource.setDefaultEncoding("UTF-8");

return messageSource;
}

@Override
public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
this.beanFactory = beanFactory;

}

@PostConstruct
public void onPostConstruct() {
ConfigurableBeanFactory configurableBeanFactory = (ConfigurableBeanFactory) beanFactory;

Iterable<Company> companies = service.findAll();
for(Company c : companies) {
String beanName= c.getSlug()+"_messageSource";
MessageSource bean = getCompanyMessageSource(c);
configurableBeanFactory.registerSingleton(beanName, bean);

messageSourceMap.put(c, bean);
}


}


private MessageSource getCompanyMessageSource(Company company) {
ReloadableResourceBundleMessageSource ms = new ReloadableResourceBundleMessageSource();
ms.setBasename("classpath:" + company.getSlug() + "/messages");
ms.setUseCodeAsDefaultMessage(true);
ms.setCacheSeconds(5);
ms.setDefaultEncoding("UTF-8");

return ms;
}


public MessageSource companyMessageSource(Company company) {
return messageSourceMap.get(company);
}

通过这种方式,我们为每个公司提供了一个默认的消息源和一个特定的消息源。我们的想法是将这个特定的消息源放入一个映射中,然后在需要时从映射中访问正确的消息源。问题是 companyMessageSource 应该是一个 bean,但我无法将参数传递给 bean,我如何动态访问正确的源?

最佳答案

我不完全确定我理解您想要如何使用创建的 bean,但是获取 MessageSource 的已注册单例的一种方法是以编程方式获取它们,如下所示:

@Service
public class CompanyService {

@Autowired
private ApplicationContext applicationContext;

public void useCompanySpecificMessageSource(Company c) {
MessageSource ms = applicationContext.getBean(c.getSlug() + "_messageSource");
log.debug(ms.getMessage("code", null, new Locale("en", "GB"));
}
}

希望这有帮助。

关于java - SPRING - 以编程方式创建 MessageSource 并将它们用作 bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48138320/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com