Я полагаю, вы смешали два понятия:
- файлы свойств
- пакеты ресурсов сообщений
Файлы свойств содержат свойства (независимые от локали). В Spring их можно загрузить, например, через util:properties
и использовать в аннотациях @Value
.
Но пакеты ресурсов сообщений (которые основаны на файлах, которые выглядят как файлы свойств) зависят от языка. Весной вы можете загрузить их через org.springframework.context.support.ResourceBundleMessageSource
. Но не вводить строку через @Value
. Вы не можете внедрить их, потому что внедрение @Value
выполняется один раз для каждого компонента, @Value
будет оцениваться один раз (чаще всего во время запуска), и будет введено рассчитанное значение. Но это не то, что вам обычно нужно при использовании пакетов ресурсов сообщений. Потому что тогда вам нужно оценивать значение каждый раз, когда используется переменная, в зависимости от языка пользователя.
Но вы можете легко построить его самостоятельно!
Единственное, что вам нужно, это этот класс:
import java.util.Locale;
import javax.annotation.Resource;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;
@Configurable
public class MSG {
private String key;
@Resource(name = "messageSource")
private MessageSource messageSource;
public MSG(String key) {
super();
this.key = key;
}
public String value() {
Locale locale = LocaleContextHolder.getLocale();
return messageSource.getMessage(key, new Object[0], locale);
}
@Override
public String toString() {
return value();
}
}
Затем вы можете использовать его следующим образом:
@Service
public class Demo {
@Value("demo.output.hallo")
private MSG hallo;
@Value("demo.output.world")
private MSG world;
public void demo(){
System.out.println("demo: " + hello + " " + world);
}
}
Чтобы запустить его, вам нужно включить <context:spring-configured />
, чтобы включить поддержку AspectJ @Configurable, и (это важно) вам нужно создать экземпляр источника сообщения Ressouce Bundle в том же контексте приложения (например, в веб-приложениях вы помещаете определение ReloadableResourceBundleMessageSource
в в большинстве случаев в контексте веб-приложения, но в данном случае это не работает, поскольку объект MSG находится в «обычном» контексте приложения.
person
Ralph
schedule
06.06.2011