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:
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.
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.