Рубрики
Без рубрики

Value Spring Трюки с аннотацией Spring @Value

Трюки с аннотациями Spring @Value – Хабиб Окунаде – Средний… С тегами spring, микросервисы, java, аннотации.

Трюки с аннотациями Spring @Value. Spring framework обеспечивает@Value… | автор Хабиб Окунаде | Medium

Хабиб Окунаде ・ 29 февраля 2020 г. ・ 6 мин. читать средне

Spring framework предоставляет аннотацию @Value в пакете org.springframework.beans.factory.annotation . Эта аннотация используется на различных уровнях в нашем приложении либо на уровне поля для внедрения зависимостей на основе выражений, при котором значение может быть введено в переменную в классе, либо на уровне параметров метода или конструктора, который указывает выражение значения по умолчанию для основного аргумента. Он также используется для динамического разрешения параметров метода обработчика, как в Spring MVC.

@Value аннотация может использоваться в классах, аннотированных @Configuration , @Component и другие стереотипные аннотации, такие как @Controller , @Service и т.д. Фактическая обработка аннотации @Value выполняется BeanPostProcessor, и поэтому @Value не может использоваться в типах классов BeanPostProcessor.

@Value аннотация использует синтаксис заполнителя свойств ${…} и язык выражений Spring, SpEL, синтаксис #{$…} формулировать выражения. ${…} является синтаксисом-заполнителем свойства, в то время как #{$…} – это синтаксис орфографии. #{$…} синтаксис также может обрабатывать заполнители свойств и многое другое.

В этой статье я расскажу о некоторых хитростях использования аннотации @Value в примере приложения Spring Boot. Отпустить, чтобы https://start.spring.io/ для создания и начальной загрузки вашего проекта.

Выберите проект Maven, Java в качестве языка, укажите вашему проекту имя группы и идентификатор артефакта. Выберите Spring Web в качестве единственной зависимости для нашего проекта.

Нажмите кнопку “Сгенерировать”, чтобы загрузить загруженный проект в виде zip-файла. Распакуйте файл и откройте его с помощью предпочитаемой вами IDE в качестве проекта Maven, чтобы загрузить все необходимые зависимости.

Создайте новый пакет, назовите его “controller” и создайте новый класс с именем ValueController.java . Убедитесь, что в нем есть следующее

Здесь я аннотировал класс с помощью @RestController, дочернего элемента контроллера stereotype, чтобы аннотация значения могла вводиться и работать должным образом.

1. @Значение Синтаксис заполнителя @Value(“”)

package com.habeebcycle.springvalueannotation.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ValueController {

    @Value("Hello World")
    private String greetingMessage;

    @GetMapping("")
    public String sendGreeting(){
        return greetingMessage;
    }
}

Аннотация значения используется для хранения значения переменной приветственное сообщение . Когда проект запущен и конечная точка http://localhost:8080 это удар, слово Hello World отображается в браузере. Это показывает, что аннотация @Value

@Value("1.234")
private double doubleValue; //could be Double

@Value("1234")
private Integer intValue; //could be int

@Value("true")
private boolean boolValue; //could be Boolean

@Value("2000")
private long longValue;

2. Синтаксис заполнителя свойства @Value @Value(“${…}”)

Большинство приложений spring имеют файл свойств, который используется для настройки некоторых значений или свойств в приложении. Приложение Spring загружает свойства из application.properties файлов в пути к классу и добавляет их в среду Spring. В приведенном выше примере инициализатор spring boot уже загрузил файл application.properties Давайте создадим некоторые свойства и получим к ним доступ в приложении, используя аннотацию @Value .

#application.properties
greeting.message=Hello World!

Мы можем использовать @Value(“${…имя объекта}”) Мы можем использовать @Value(“${…имя объекта}”)

ackage com.habeebcycle.springvalueannotation.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ValueController {

    @Value("${greeting.message}") 
    private String greetingMessage;

    @GetMapping("")
    public String sendGreeting(){
        return greetingMessage;
    }
}

Мы можем использовать @Value(“${…имя объекта}”) в браузере. Значение свойства вводится во время выполнения из файла свойств в переменную.

Если имя свойства отсутствует в файле application.properties , приложение выдает ошибки, как показано ниже:

Error starting ApplicationContext. To display the conditions report re-run your application with 'debug' enabled.
2020-02-29 21:54:43.953 ERROR 2996 --- [           main] o.s.boot.SpringApplication               : Application run failed
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'valueController': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'greeting.message' in value "${greeting.message}"

Для аннотации может быть задано значение по умолчанию, которое можно использовать, если имя свойства в аннотации @Value отсутствует в файле application.properties . Реализация показана ниже:

package com.habeebcycle.springvalueannotation.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class ValueController {

    @Value("${greeting.message:Greeting not found!}")
    private String greetingMessage;

    @GetMapping("")
    public String sendGreeting(){
        return greetingMessage;
    }
}

Перед именем свойства ставится двоеточие : , а аннотации присваивается значение по умолчанию. Это указывает аннотации использовать предоставленное ей значение по умолчанию, если имя свойства не найдено в файле application.properties . Необходимо соблюдать осторожность при указании значения по умолчанию относительно того, где находится двоеточие : . Если между именем свойства и двоеточием есть пробел : , как показано на рисунке

@Value("${greeting.message :Greeting not found!}")
private String greetingMessage;

указанное значение по умолчанию будет использоваться всегда, даже если имя свойства существует в файле свойств. Поэтому пробел не следует вставлять перед двоеточием : поскольку это может привести к неожиданному поведению. Это также относится к другим примитивам и типам оболочек, таким как int, double, boolean, Integer, Double и Boolean, как показано ниже:

#application.properties

my.int.value=20
my.double.value=3.142
my.boolean.value=true

//In the Java file

@Value("${my.int.value:0}")
private int intValue; //injects 20 at runtime

@Value("${my.double.value: 0.0}")
private double doubleValue; //injects 3.142 at runtime

//This takes the default value provided despite having the property 
//name in the properties file.
@Value("${my.boolean.value :false}")
private boolean boolValue; //injects false because of space

//Property name not found in the properties file
@Value("${my.long.value:300}")
private long longValue; //injects 300 at runtime

3. Синтаксис заполнителя свойства @Value @Value(“${…}”) со списком значений

@Значение(“${…}”) может использоваться для ввода значений списка из файла свойств во время выполнения. Рассмотрим приведенный ниже файл свойств:

#application.properties
my.weekdays=Mon,Tue,Wed,Thu,Fri

и в файле Java

@Value("${my.weekdays}")
private List strList; // injects [Mon, Tue, Wed, Thu, Fri]

//Providing default value
@Value("${my.weekends:Sat,Sun,Fri}")
private List strList2; // injects [Sat, Sun, Fri]

4. @Value Синтаксис языка выражений Spring @Value(“#{${…}}”) с картой (пара ключ-значение)

@Value(“#{${…}}”) может использоваться для ввода пары map (ключ-значение) из файла свойств во время выполнения. В приведенном ниже примере показано, как это сделать:

#application.properties
database.values={url:'http://127.0.0.1:3306/', db:'mySql', username:'root', password:'root'}

Мы можем использовать SpEL следующим образом, чтобы ввести свойство database.values .

package com.habeebcycle.springvalueannotation.controller;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.Map;

@RestController
public class ValueController {

    @Value("#{${database.values}}")
    private Map dbValues;

    @GetMapping("")
    public Map getDBProps(){
        return dbValues;
    }
}

Попадание в конечную точку http://localhost:8080 вернет следующий вывод

{
  "url": "http://127.0.0.1:3306/",
  "db": "mySql",
  "username": "root",
  "password": "root"
}

Чтобы использовать значение по умолчанию в случае, если имя свойства не найдено в файле свойств.

@Value("#{${database.values: {url: 'http://127.0.0.1:3308/', db: 'mySql', username: 'root', password: ''}}}")
private Map dbValues;

Когда свойство database.values не определено в файле свойств, карта по умолчанию {url:’ http://127.0.0.1:3308/ ‘, db:’MySQL’, имя пользователя:’root’, пароль:”} будет введено в переменную http://127.0.0.1:3308/ ', db:'MySQL', имя пользователя:'root', пароль:"}

5. Внедрение конструкции @Value с помощью @Value(“${…}”)

@Value можно использовать с параметром конструктора, а затем при внедрении конструктора Spring введет значение, указанное аннотацией @Value . Предположим, у нас есть следующие свойства в файле свойств.

#application.properties

company.name= Scopesuite Pty ltd
#company.location= Sydney

Мы можем использовать @Value аннотацию во время построения следующим образом

package com.habeebcycle.springvalueannotation.service;
import org.springframework.stereotype.Service;
@Service
public class CompanyService {
   private String compName;
   private String location;

   public CompanyService(@Value("${company.name}") String compName,
    @Value("${company.location:Washington}") String location){

       this.compName = compName;
       this.location = location;
   }
   ------
}

В приведенном выше конструкторе первый аргумент будет введен с использованием значения из файла свойств. Если ключ свойства для второго аргумента не найден, будет введено значение по умолчанию.

Оригинал: “https://dev.to/habeebcycle/spring-value-annotation-tricks-1a80”