Spring 3.2 аннотация @value с чистой конфигурацией java не работает, но Environment.getProperty работает
Я ломаю голову над этим. Не уверен, что мне не хватает. Я не могу получить аннотации @Value
для работы в чистом java-настроенном приложении spring (не в Интернете)
@Configuration
@PropertySource("classpath:app.properties")
public class Config {
@Value("${my.prop}")
String name;
@Autowired
Environment env;
@Bean(name = "myBean", initMethod = "print")
public MyBean getMyBean(){
MyBean myBean = new MyBean();
myBean.setName(name);
System.out.println(env.getProperty("my.prop"));
return myBean;
}
}
Файл свойства содержит только my.prop=avalue
bean выглядит следующим образом:
public class MyBean {
String name;
public void print() {
System.out.println("Name: " + name);
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Переменная среды печатает значение правильно, @Value
- нет.
avalue
Name: ${my.prop}
Основной класс просто инициализирует контекст.
AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext(Config.class);
Однако, если я использую
@ImportResource("classpath:property-config.xml")
с этим фрагментом
<context:property-placeholder location="app.properties" />
тогда он отлично работает. Конечно, теперь среда возвращает null
.
Ответы
Ответ 1
Добавьте следующий bean объявление в класс Config
@Bean
public static PropertySourcesPlaceholderConfigurer propertyPlaceholderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
Для того, чтобы @Value
выполнялись аннотации к работе PropertySourcesPlaceholderConfigurer
, необходимо зарегистрировать. Это делается автоматически при использовании <context:property-placeholder>
в XML, но при использовании @Configuration
необходимо зарегистрировать его как static @Bean
.
Смотрите документацию @PropertySource и эту Spring Framework проблему Jira.