2016-06-20 3 views
2

настоящего времени у меня следующий код:Как использовать Spring @Value без файла свойств?

int port = System.getProperty("port") != null ? 
      Integer.parseInt(System.getProperty("port")) : 
      8080; 

мне не нравится это, и хотел бы заменить его весеннюю альтернативу. Итак, я думал, что должен использовать аннотацию @Value. Я не хочу иметь файл свойств для этого. Тем не менее, я хотел бы иметь значение по умолчанию через аннотацию.

Есть ли способ сделать это без файла свойств и какова будет правильная реализация кода? Должен ли я по-прежнему иметь PropertySourcesPlaceholderConfigurer? Не могли бы вы показать мне рабочий пример того, как это сделать?

+0

Можете ли вы указать, для какой версии весеннего ответа требуется? – tkachuko

+0

4.2.3.RELEASE, я считаю ....последний до последнего. – carlspring

+1

Просто добавьте '@ PropertySourcesPalceholderConfigurer', добавьте' @Value ("$ {port: 8080}" '. Перезагрузите и сделайте. Вам не нужен файл свойств для использования источников ресурсов. Если вы не используете' @ PropertySourcesPlaceholderConfigurer' вы все еще можете использовать SpEL, но это ограничит вас только свойствами системы или среды и станет сложным, если вы хотите иметь резервную копию. –

ответ

4

Предполагая, что вы используете Java на основе сконфигурированы.

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

Затем аннотировать поле с @Value

@Value("${port:8080}") 
private int port; 

это будет проверять свойства системы и среды для данного свойства port. При включении JNDI, который будет проверен, и при наличии среды, основанной на сервлетах, вы также можете использовать ее как переменную сервлета.

Использование PropertySourcesPlaceholderConfigurer не требует файлов свойств, для которых требуется PropertySource s, для которых существует несколько различных реализаций.

Если вы не хотите регистрировать PropertySourcesPlaceholderConfigurer, вы можете вернуться в SpEL, но это сделало бы его более сложным (и уродливым imho).

1

Я не пробовал, но вы можете использовать любые SpEL expression. Ваш код может быть переписано в виде:

@Value("#{systemProperties['port'] ?: 8080}") 
private int port; 

Обратите внимание, что я использую safe navigation operator.

Что касается PropertySourcesPalceholderConfigurer, я не думаю, что вам нужно, поскольку у вас есть язык зависимость Spring Expression в вашем пути к классам:

<dependency> 
    <groupId>org.springframework</groupId> 
    <artifactId>spring-expression</artifactId> 
    <version>4.2.3.RELEASE</version> 
</dependency> 
1

Протестировано и работает.

  1. Да, вам нужно PropertyPlaceholderConfigurer однако это не требует файл свойств
  2. Reference переменная системы, как это: @Value("#{systemEnvironment['YOUR_VARIABLE_NAME'] ?: 'DEFAULT_VALUE'}"

Пример кода:

package abc; 
import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Value; 
import org.springframework.stereotype.Component; 

@Component 
public class Test { 

    public final String javaPath; 

    @Autowired 
    public Test(@Value("#{systemEnvironment['Path']}") String javaPath) { 
     this.javaPath = javaPath; 
    } 
} 

Конфигурация:

@Configuration 
@ComponentScan("abc") 
public class Config { 

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

Запуск все образца:

public class Runner { 

    public static void main(String[] args) { 
     AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Config.class); 
     Test bean = context.getBean(Test.class); 
     System.out.println(bean.javaPath); 
    } 
} 

Надеется, что это помогает.

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