A anotação @Value da Spring é usada para atribuir valores padrão a variáveis e argumentos de método. Podemos ler variáveis de ambiente da Spring, bem como variáveis de sistema, usando a anotação @Value. A anotação @Value da Spring também suporta SpEL (Spring Expression Language). Vamos examinar alguns exemplos de uso da anotação @Value.
Spring @Value – Valor Padrão
Podemos atribuir um valor padrão a uma propriedade de classe usando a anotação @Value.
@Value("Default DBConfiguration")
private String defaultName;
A argumento da anotação @Value pode ser apenas uma string, mas o Spring tenta convertê-lo para o tipo especificado. O código abaixo funcionará bem e atribuirá os valores booleano e inteiro à variável.
@Value("true")
private boolean defaultBoolean;
@Value("10")
private int defaultInt;
Spring @Value – Propriedade de Ambiente da Spring
@Value("${APP_NAME_NOT_FOUND}")
private String defaultAppName;
Se a chave não for encontrada nas propriedades do ambiente Spring, então o valor da propriedade será ${APP_NAME_NOT_FOUND}
. Podemos atribuir um valor padrão que será atribuído se a chave estiver ausente das propriedades do ambiente Spring.
@Value("${APP_NAME_NOT_FOUND:Default}")
private String defaultAppName;
Primavera @Valor – Ambiente do Sistema
Ao ser populado o ambiente Spring, ele lê todas as variáveis de ambiente do sistema e as armazena como propriedades. Portanto, também podemos atribuir variáveis de sistema usando a anotação @Valor.
@Value("${java.home}")
private String javaHome;
@Value("${HOME}")
private String homeDir;
Primavera @Valor – SpEL
Também podemos usar a Linguagem de Expressão Spring com a anotação @Valor. Assim, podemos ler a propriedade do sistema java home usando SpEL também.
@Value("#{systemProperties['java.home']}")
private String javaHome;
Primavera @Valor com métodos
Quando a anotação @Value é encontrada em um método, o contexto do Spring irá invocá-lo quando todas as configurações e beans do Spring estiverem sendo carregados. Se o método tiver múltiplos argumentos, então o valor de cada argumento é mapeado a partir da anotação do método. Se quisermos valores diferentes para diferentes argumentos, então podemos usar a anotação @Value diretamente com o argumento.
@Value("Test")
public void printValues(String s, String v){} //both 's' and 'v' values will be 'Test'
@Value("Test")
public void printValues(String s, @Value("Data") String v){}
// s=Teste, v=Dados
Primavera @Value Exemplo
Vamos criar uma aplicação Spring simples onde vamos usar a anotação @Value para ler propriedades e atribuí-las a variáveis de classe. Crie um projeto Maven e adicione as dependências principais do Spring.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>5.0.6.RELEASE</version>
</dependency>
Nossa estrutura de projeto final ficará como na imagem abaixo, vamos examinar cada um dos componentes um por um. Crie uma classe de componente onde iremos injetar valores de variáveis através da anotação @Value.
package com.journaldev.spring;
import org.springframework.beans.factory.annotation.Value;
public class DBConnection {
@Value("${DB_DRIVER_CLASS}")
private String driverClass;
@Value("${DB_URL}")
private String dbURL;
@Value("${DB_USERNAME}")
private String userName;
@Value("${DB_PASSWORD}")
private char[] password;
public DBConnection() {
}
public void printDBConfigs() {
System.out.println("Driver Class = " + driverClass);
System.out.println("DB URL = " + dbURL);
System.out.println("User Name = " + userName);
// Nunca faça o seguinte em um ambiente de produção :D
System.out.println("Password = " + String.valueOf(password));
}
}
Agora temos que criar uma classe de Configuração e fornecer um método @Bean para a classe DBConnection.
package com.journaldev.spring;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
@Configuration
@PropertySource("classpath:db.properties")
@PropertySource(value = "classpath:root.properties", ignoreResourceNotFound = true)
public class DBConfiguration {
@Value("Default DBConfiguration")
private String defaultName;
@Value("true")
private boolean defaultBoolean;
@Value("10")
private int defaultInt;
@Value("${APP_NAME_NOT_FOUND:Default}")
private String defaultAppName;
// @Value("#{systemProperties['java.home']}")
@Value("${java.home}")
private String javaHome;
@Value("${HOME}")
private String homeDir;
@Bean
public DBConnection getDBConnection() {
DBConnection dbConnection = new DBConnection();
return dbConnection;
}
@Value("Test")
public void printValues(String s, @Value("another variable") String v) {
System.out.println("Input Argument 1 =" + s);
System.out.println("Input Argument 2 =" + v);
System.out.println("Home Directory = " + homeDir);
System.out.println("Default Configuration Name = " + defaultName);
System.out.println("Default App Name = " + defaultAppName);
System.out.println("Java Home = " + javaHome);
System.out.println("Boolean = " + defaultBoolean);
System.out.println("Int = " + defaultInt);
}
}
Aqui está nossa classe principal onde estamos criando o contexto Spring baseado em anotações.
package com.journaldev.spring;
import java.sql.SQLException;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
public class SpringMainClass {
public static void main(String[] args) throws SQLException {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
context.scan("com.journaldev.spring");
context.refresh();
System.out.println("Refreshing the spring context");
DBConnection dbConnection = context.getBean(DBConnection.class);
dbConnection.printDBConfigs();
// feche o contexto Spring
context.close();
}
}
Ao executar a classe, ela produzirá a seguinte saída.
Input Argument 1 =Test
Input Argument 2 =another variable
Home Directory = /Users/pankaj
Default Configuration Name = Default DBConfiguration
Default App Name = Default
Java Home = /Library/Java/JavaVirtualMachines/jdk-10.0.1.jdk/Contents/Home
Boolean = true
Int = 10
Refreshing the spring context
Driver Class = com.mysql.jdbc.Driver
DB URL = jdbc:mysql://localhost:3306/Test
User Name = journaldev
Password = journaldev
Observe que o método printValues()
da classe de Configuração está sendo chamado antes de nosso contexto estar pronto para atender às solicitações do usuário. Isso é tudo para o exemplo de anotação Spring @Value, você pode baixar o código de exemplo do nosso Repositório GitHub.
Source:
https://www.digitalocean.com/community/tutorials/spring-value-annotation