La anotaci贸n @Value en Spring

    Introducci贸n

    El enfoque principal de este art铆culo es ayudarlo a comprender c贸mo Spring’s @Valor la anotaci贸n funciona.

    @Value es una anotaci贸n de Java que se utiliza en el nivel de par谩metro de campo o m茅todo / constructor e indica un valor predeterminado para el argumento afectado. Se usa com煤nmente para inyectar valores en variables de configuraci贸n, que mostraremos y explicaremos en la siguiente parte del art铆culo.

    Tarea b谩sica

    Para los ejemplos m谩s f谩ciles, asignaremos valores a tres campos diferentes usando el @Value anotaci贸n d谩ndoles valores expl铆citos:

    @Value("John")
    private String trainee;
    
    @Value("100")
    private int hoursOfCode;
    
    @Value("true")
    private boolean passedAssesmentTest;
    

    Es muy importante tener en cuenta que el argumento pasado al @Value La anotaci贸n solo puede ser una String. Spring convertir谩 el valor al tipo especificado y la asignaci贸n se realizar谩 sin ning煤n problema, incluso si estamos pasando String valores a int o boolean variables.

    Ambiente Springl

    Inyectando valores de archivos de propiedades con la ayuda de @Value La anotaci贸n es probablemente el caso de uso m谩s utilizado en aplicaciones de la vida real.

    Usaremos el archivo de propiedades predeterminado para Spring Boot – application.properties, donde podemos definir variables a las que podemos acceder posteriormente:

    car.brand=Audi
    car.color=Red
    car.power=150
    
    @Value("${car.brand")
    private String brand;
    
    @Value("${car.color}")
    private String color;
    
    @Value("${car.power}")
    private int power;
    

    En este ejemplo, los valores de las variables se leen del application.properties archivo y asignado a ellos durante la creaci贸n del bean.

    La mayor铆a de las veces, usamos este enfoque para inyectar valores de configuraci贸n desde el application.properties lima en frijoles.

    Valor por defecto

    Los valores predeterminados se utilizan como “respaldo” si la propiedad que deseamos inyectar no est谩 definida o falta:

    @Value("${car.type:Sedan}")
    private String type;
    

    En el ejemplo anterior, porque no tenemos ninguna car.type propiedad en application.properties, Spring asignar谩 Sedan al type variable como valor predeterminado.

    Si el car.type la propiedad se inserta en el archivo de propiedades, en su lugar se utilizar谩 el nuevo valor.

    Variables del sistema

    Tambi茅n podemos acceder a las variables del sistema que se almacenan como propiedades por la aplicaci贸n Spring al inicio:

    @Value("${user.name}")
    // Or
    @Value("${username}")
    private String userName;
    
    @Value("${number.of.processors}")
    // Or
    @Value("${number_of_processors}")
    private int numberOfProcessors;
    
    @Value("${java.home}")
    private String java;
    

    Las variables se pueden llamar con diferentes convenciones de nomenclatura: Spring nos busca y asigna el valor correcto.

    Valor del m茅todo global

    Porque @Value es procesado por el BeanPostProcessor class, se invocar谩 cuando Spring est茅 construyendo el contexto Spring creando instancias de archivos de configuraci贸n y beans.

    Esto significa que al tener @Value en un m茅todo, todos los argumentos se asignar谩n con el valor proporcionado a la anotaci贸n:

    @Value("${car.brand}")
    public CarData setCarData(String color, String brand) {
        carData.setCarColor(color);
        carData.setCarBrand(brand);
    }
    

    Si estamos imprimiendo carData.getCarColor() y carData.getCarBrand() obtendremos el car.brand valor en ambas ocasiones, porque como dijimos, todos los argumentos se asignar谩n con el valor proporcionado.

    Valor del m茅todo del par谩metro

    Podemos arreglar esto usando @Value directamente en el par谩metro del m茅todo:

    @Value("${car.brand}")
    public CarData setCarData(@Value("${car.color}") String color, String brand) {
        carData.setCarColor(color);
        carData.setCarBrand(brand);
    }
    

    Ahora, si estamos imprimiendo los valores del carData objeto: el campo de color tendr谩 el car.color value, porque proporcionamos el valor al par谩metro del m茅todo en s铆.

    Lenguaje de expresi贸n de Spring (SpEL)

    Spring Expression Language (SpEL) es un lenguaje de expresi贸n que sirve como base para la evaluaci贸n de expresiones dentro del portafolio de Spring.

    B谩sicamente, cuando se usa SpEL junto con el @Value anotaci贸n, solo estamos cambiando la forma en que le decimos a Spring lo que necesitamos. Miremos m谩s de cerca:

    @Value("#{systemProperties['user.name']}")
    private String userName;
    

    As铆 es como inyectar铆as una propiedad espec铆fica del sistema. Por otro lado, podr铆amos inyectar todas las propiedades mediante:

    @Value("#{systemProperties}")
    private Map<String, String> properties;
    

    Ahora sabemos que podemos usar el @Value anotaci贸n para m茅todos como valor global o como valor de par谩metro.

    Dado que los constructores son esencialmente m茅todos, tambi茅n podemos usar la anotaci贸n en los constructores:

    public Driver(@Value("#{systemProperties['user.name']}") String name, String location) {
        this.name = name;
        this.location = location;
    }
    

    Inyectar en mapas

    Con SpEL, podemos hacer algunas otras cosas bastante interesantes cuando se combina con el @Value anotaci贸n. Por ejemplo, hagamos un Map eso representa indoor y outdoor aficiones de un estudiante. Cada uno de estos puede tener varios valores:

    student.hobbies={indoor: 'reading, drawing', outdoor: 'fishing, hiking, bushcraft'}
    

    Ahora, para inyectar esto, necesitaremos un Map<String, List<String>>:

    @Value("#{${student.hobbies}}")
    private Map<String, List<String>> hobbies;
    

    Inyectar en listas

    Si una propiedad tiene valores separados por comas, como una lista simple de libros, podemos usar SpEL para interpretarla y transformarla en una lista:

    student.booksRead=Harry Potter,The Hobbit,Game of Thrones
    

    Usando el split() m茅todo, y dividir por cada coma (,), podemos inyectar estos valores en una lista:

    @Value("#{'${student.booksRead}'.split(',')}")
    private List<String> booksRead;
    

    Conclusi贸n

    Tan pronto como termine trabajando en una aplicaci贸n real, se dar谩 cuenta de que la configuraci贸n es un tema importante y si est谩 utilizando Spring. Existe una gran posibilidad de que ya use o tendr谩 que usar el @Value anotaci贸n extensamente.

    Comprender esta funcionalidad b谩sica es muy importante porque si no lo hace, podr铆a terminar us谩ndola totalmente mal.

    Tambi茅n debemos ser conscientes de que no todo lo que parece simple tambi茅n es muy bueno para soluciones a largo plazo. Por ejemplo, solo deber铆amos usar @Value en componentes / servicios encapsulados (podemos llamarlos servicios de configuraci贸n).

    De esta forma, tendremos todas nuestras configuraciones en un solo lugar, y ese componente solo tendr谩 la responsabilidad de cargarlas y proporcionarlas a otros componentes.

    Etiquetas:

    Deja una respuesta

    Tu direcci贸n de correo electr贸nico no ser谩 publicada. Los campos obligatorios est谩n marcados con *