Annotazione @Value di Spring

Spring @Value annotation viene utilizzata per assegnare valori predefiniti a variabili e argomenti di metodo. Possiamo leggere le variabili di ambiente di Spring così come le variabili di sistema usando l’annotazione @Value. L’annotazione Spring @Value supporta anche SpEL. Vediamo alcuni esempi di utilizzo dell’annotazione @Value.

Spring @Value – Valore Predefinito

Possiamo assegnare un valore predefinito a una proprietà di classe usando l’annotazione @Value.

@Value("Default DBConfiguration")
private String defaultName;

L’argomento dell’annotazione @Value può essere solo una stringa, ma Spring cerca di convertirlo nel tipo specificato. Il codice seguente funzionerà correttamente e assegnerà i valori booleano e intero alla variabile.

@Value("true")
private boolean defaultBoolean;

@Value("10")
private int defaultInt;

Spring @Value – Proprietà di Ambiente di Spring

@Value("${APP_NAME_NOT_FOUND}")
private String defaultAppName;

Se la chiave non viene trovata nelle proprietà dell’ambiente Spring, il valore della proprietà sarà ${APP_NAME_NOT_FOUND}. Possiamo assegnare un valore predefinito che verrà assegnato se la chiave manca dalle proprietà dell’ambiente Spring.

@Value("${APP_NAME_NOT_FOUND:Default}")
private String defaultAppName;

Spring @Value – Ambiente di sistema

Quando l’ambiente Spring è popolato, legge tutte le variabili di ambiente di sistema e le memorizza come proprietà. Quindi possiamo assegnare anche variabili di sistema utilizzando l’annotazione @Value.

@Value("${java.home}")
private String javaHome;
	
@Value("${HOME}")
private String homeDir;

Spring @Value – SpEL

Possiamo anche utilizzare il Linguaggio di Espressione Spring con l’annotazione @Value. Quindi possiamo leggere la proprietà del sistema java home usando anche SpEL.

@Value("#{systemProperties['java.home']}")
private String javaHome;

Spring @Value con metodi

Quando viene trovata l’annotazione @Value su un metodo, il contesto di Spring lo invocherà quando tutte le configurazioni e i bean di Spring vengono caricati. Se il metodo ha più argomenti, allora ogni valore degli argomenti viene mappato dall’annotazione del metodo. Se vogliamo valori diversi per argomenti diversi, possiamo utilizzare direttamente l’annotazione @Value con l’argomento.

@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=Test, v=Data

Spring @Value Esempio

Creiamo un’applicazione Spring semplice in cui useremo l’annotazione @Value per leggere le proprietà e assegnarle alle variabili di classe. Crea un progetto Maven e aggiungi le dipendenze di base di Spring.

<dependency>
	<groupId>org.springframework</groupId>
	<artifactId>spring-context</artifactId>
	<version>5.0.6.RELEASE</version>
</dependency>

La struttura finale del nostro progetto sarà simile all’immagine seguente, esamineremo ciascuno dei componenti uno per uno. Crea una classe componente dove inietteremo i valori delle variabili tramite l’annotazione @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);

		// Mai fare ciò in un ambiente di produzione :D
		System.out.println("Password = " + String.valueOf(password));
	}
}

Ora dobbiamo creare una classe di configurazione e fornire un metodo @Bean per la 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);

	}

}

Ecco la nostra classe principale in cui stiamo creando un contesto Spring basato su annotazioni.

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();
		
		// chiudi il contesto Spring
		context.close();
	}

}

Quando eseguirai la classe, produrrà l’output seguente.

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

Nota che il metodo printValues() della classe di configurazione viene chiamato prima che il nostro contesto sia pronto a gestire le richieste dell’utente. Questo è tutto per l’esempio di annotazione Spring @Value, puoi scaricare il codice di esempio dal nostro repository su GitHub.

Progetto di annotazione Spring @Value

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