Трюки с аннотациями 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 ListstrList; // 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 MapdbValues; @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 MapdbValues;
Когда свойство 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”