Um guia rápido para Spring @Value

Um guia rápido para Spring @Value

1. Visão geral

Neste artigo rápido, vamos parahave a look at the @Value Spring annotation.

Essa anotação pode ser usada para injetar valores em campos nos beans gerenciados pelo Spring e pode ser aplicada no campo ou no nível do parâmetro construtor / método.

Leitura adicional:

O que é um Spring Bean?

Uma explicação rápida e prática do que é um Spring Bean.

Read more

Usando Spring @Value com padrões

Um guia rápido e prático para definir valores padrão ao usar a anotação @Value no Spring.

Read more

2. Configurando o aplicativo

Para descrever diferentes tipos de uso para esta anotação, precisamos configurar uma classe de configuração de aplicativo Spring simples.

E, naturalmente,we’ll need a properties file para definir os valores que queremos injetar com a anotação@Value. E então, primeiro precisamos definir um@PropertySource em nossa classe de configuração - com o nome do arquivo de propriedades.

Vamos definir o arquivo de propriedades:

value.from.file=Value got from the file
priority=Properties file
listOfValues=A,B,C

3. Exemplos de uso

Como exemplo de uso básico e praticamente inútil, podemos injetar apenas "valor da string" da anotação no campo:

@Value("string value")
private String stringValue;

Usar a anotação@PropertySource nos permite trabalhar com valores de arquivos de propriedades com a anotação@Value. No exemplo a seguir, obtemos“Value got from the file” atribuído ao campo:

@Value("${value.from.file}")
private String valueFromFile;

Também podemos definir o valor das propriedades do sistema com a mesma sintaxe. Vamos supor que definimos uma propriedade do sistema chamadasystemValue e vejamos o seguinte exemplo:

@Value("${systemValue}")
private String systemValue;

Valores padrão podem ser fornecidos para propriedades que podem não ser definidas. Neste exemplo, o valor“some default” será injetado:

@Value("${unknown.param:some default}")
private String someDefault;

Se a mesma propriedade for definida como uma propriedade do sistema e no arquivo de propriedades, a propriedade do sistema será aplicada.

Suponha que tenhamos uma propriedadepriority definida como uma propriedade do sistema com o valor“System property”e definida como outra coisa no arquivo de propriedades. No código a seguir, o valor seria“System property”:

@Value("${priority}")
private String prioritySystemProperty;

Às vezes, precisamos injetar um monte de valores. Seria conveniente defini-los como valores separados por vírgula para a propriedade única no arquivo de propriedades ou como uma propriedade do sistema e injetar em uma matriz. Na primeira seção, definimos valores separados por vírgula emlistOfValues do arquivo de propriedades,, portanto, no exemplo a seguir, os valores da matriz seriam[“A”, “B”, “C”]:

@Value("${listOfValues}")
private String[] valuesArray;

4. Exemplos avançados com SpEL

Também podemos usar expressões SpEL para obter o valor. Se tivermos uma propriedade de sistema chamadapriority,, seu valor será aplicado ao campo no próximo exemplo:

@Value("#{systemProperties['priority']}")
private String spelValue;

Se não tivermos definido a propriedade do sistema, então o valornull será atribuído. Para evitar isso, podemos fornecer um valor padrão na expressão SpEL. No exemplo a seguir, obtemos o valor“some default” para o campo se a propriedade do sistema não estiver definida:

@Value("#{systemProperties['unknown'] ?: 'some default'}")
private String spelSomeDefault;

Além disso, podemos usar um valor de campo de outros beans. Suponha que tenhamos um bean denominadosomeBean com um camposomeValue igual a10. Então10 será atribuído ao campo neste exemplo:

@Value("#{someBean.someValue}")
private Integer someBeanValue;

Podemos manipular propriedades para obterList dos valores. No exemplo a seguir, obtemos uma lista dos valores de sequência A, B e C:

@Value("#{'${listOfValues}'.split(',')}")
private List valuesList;

5. Usando@Value comMaps

Também podemos usar a anotação@Value para injetar uma propriedadeMap.

Primeiro, precisamos definir a propriedade na forma\{key: ‘value' }  em nosso arquivo de propriedades:

valuesMap={key1: '1', key2: '2', key3: '3'}

Observe que os valores emMap devem estar entre aspas simples.

Agora podemos injetar esse valor do arquivo de propriedades como umMap:

@Value("#{${valuesMap}}")
private Map valuesMap;

Se precisarmos deto get the value of a specific key emMap, tudo o que precisamos fazer éadd the key’s name in the expression:

@Value("#{${valuesMap}.key1}")
private Integer valuesMapKey1;

Se não tivermos certeza seMap contém uma determinada chave, devemos escolhera safer expression that will not throw an exception but set the value to null quando a chave não for encontrada:

@Value("#{${valuesMap}['unknownKey']}")
private Integer unknownMapKey;

Também podemosset default values for the properties or keys that might not exist:

@Value("#{${unknownMap : {key1: '1', key2: '2'}}}")
private Map unknownMap;

@Value("#{${valuesMap}['unknownKey'] ?: 5}")
private Integer unknownMapKeyWithDefaultValue;

Map entries can also be filtered antes da injeção. Vamos supor que precisamos obter apenas as entradas cujos valores são maiores que um:

@Value("#{${valuesMap}.?[value>'1']}")
private Map valuesMapFiltered;

Também podemos usar a anotação@Value parainject all current system properties:

@Value("#{systemProperties}")
private Map systemPropertiesMap;

6. Conclusão

Neste tutorial rápido, examinamos as várias possibilidades de usar a anotação@Value com propriedades simples definidas no arquivo, com propriedades do sistema e com propriedades calculadas com expressões SpEL.

Como sempre, o aplicativo de exemplo está disponívelon GitHub project.