2014-10-10 4 views
1

Мне нравятся многие функции Play Framework 2 (я использую его с Java), но, будучи поклонником Dependency Injection, я люблю Spring и, в частности, способ ввода конфигурации в объекты посредством просто используя аннотацию @Value.Spring Injection с платформой Play2

Поэтому я хотел бы знать, как вводить переменную экземпляра значение свойства с помощью встроенного механизма разрешения свойств Play. Что-то вроде этого:

@Component 
public class SpringBeanWithinAPlay2Application { 

    @Value("${application.timeout:10}") 
    private int timeout; 
} 

Любая подсказка кого-нибудь? Большое спасибо заранее.

ответ

2

У меня была та же проблема, некоторое время назад, и это был мой способ сделать эту работу:

Во-первых, когда вы boostrap свой контекст Spring Application (я использую конфигурацию на основе аннотаций, но то же должен работать на основе XML) , вы должны добавить пользовательский PropertySource, что позволяет Spring добавлять новый способ разрешения свойств. Что-то вроде этого:

public static void initialize() { 
    ctx = new AnnotationConfigApplicationContext(); 
    ctx.getEnvironment().getPropertySources().addFirst(new PlayFrameworkPropertySource()); 
    ctx.scan("somepackage"); 
    ctx.refresh(); 
} 

Пользовательский класс PlayFrameworkPropertySource является тот, который делает волшебство:

public class PlayFrameworkPropertySource extends PropertySource<Object> { 

    public PlayFrameworkPropertySource() { 
     super("Play Framework properties resolution mechanism"); 
    } 

    @Override 
    public Object getProperty(String propertyName) { 
     // or ConfigFactory.load().getString(propertyName), as you prefer... 
     return Configuration.root().getString(propertyName); 
    } 
} 

Для того, чтобы все это работало, вам просто нужно сделать еще одну вещь: явно объявить боб типа PropertySourcesPlaceholderConfigurer в некотором @Configuration классе вы могли бы использовать:

@Bean 
public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() { 
    return new PropertySourcesPlaceholderConfigurer(); 
} 

Важное примечание: этот компонент должен быть static, так как это BeanFactoryPostProcessor, и он должен быть загружен до любого другого обычного @Bean.

Это работало как очарование для меня, надеюсь, что это поможет кому-то еще!

Приветствия,
Джонатан

+0

Спасибо за это. Это сделал трюк для меня! – Khaleesi

Смежные вопросы