Spring @Value Annotation

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.

Projeto de Anotação Spring @Value

Source:
https://www.digitalocean.com/community/tutorials/spring-value-annotation