Java annotation value method

Аннотации в JAVA: обзор синтаксиса и создание собственных

Статья ориентирована больше на новичков, или тех, кто еще не работал с данным механизмом в языке. Я постараюсь рассказать, что это такое, зачем они нужны, и как можно самому создавать удобные для себя аннотации.

Аннотации представляют из себя дескрипторы, включаемые в текст программы, и используются для хранения метаданных программного кода, необходимых на разных этапах жизненного цикла программы.
Информация, хранимая в аннотациях, может использоваться соответствующими обработчиками для создания необходимых вспомогательных файлов или для маркировки классов, полей и т.д.

Синтаксис

Аннотация задается описанием соответствующего интерфейса.
Например так:

import java.lang.annotation.*; @Target(value=ElementType.FIELD) @Retention(value= RetentionPolicy.RUNTIME) public @interface Name

Как видно из примера выше, аннотация определяется описанием с ключевым словом interface и может включать в себя несколько полей, которые можно задать как обязательными, так и не обязательными. В последнем случае подставляется default значение поля.
Также из примера видно, что саму аннотацию можно пометить несколькими аннотациями.
Разберемся для начала, чем можно пометить собственную аннотацию, и зачем.

Аннотация @Retention позволяет указать жизненный цикл аннотации: будет она присутствовать только в исходном коде, в скомпилированном файле, или она будет также видна и в процессе выполнения. Выбор нужного типа зависит от того, как вы хотите использовать аннотацию, например, генерировать что-то побочное из исходных кодов, или в процессе выполнения стучаться к классу через reflection.

Аннотация @Target указывает, что именно мы можем пометить этой аннотацией, это может быть поле, метод, тип и т.д.

Читайте также:  Qr код opencv python

Аннотация @Documentedуказывает, что помеченная таким образом аннотация должна быть добавлена в javadoc поля/метода и т.д.
Например, класс, помеченный аннотацией без @Documented, будет выглядеть так:

public class TestClass extends java.lang.Object

А если в описание аннотации добавить @Documented, получим:

@ControlledObject(name="name") public class TestClass extends java.lang.Object

Аннотация @Inherited помечает аннотацию, которая будет унаследована потомком класса, отмеченного такой аннотацией.
Сделаем для примера пару аннотаций и пометим ими класс.

@Inherited @interface PublicAnnotate < >@interface PrivateAnnotate < >@PublicAnnotate @PrivateAnnotate class ParentClass < >class ChildClass extends ParentClass

Класс ChildClass унаследует от родительского класса только аннотацию PublicAnnotate.

Пример своей аннотации.

Попробуем теперь написать рабочий пример с использованием аннотаций.
Представим себе, что у нас есть какой-то самодельный проект, который на вход получает класс, специально заанотированный, чтобы проект мог управлять жизненным циклом объектов этого класса, и пусть там будут аннотации StartObject, StopObject для описания методов класса, и ControlledObject для описания самого класса. Последней аннотации дадим еще поле name, путь там хранится якобы имя для поиска.
Аннотации будут выглядеть так:

@Target(value=ElementType.METHOD) @Retention(value= RetentionPolicy.RUNTIME) public @interface StartObject < >@Target(value=ElementType.METHOD) @Retention(value= RetentionPolicy.RUNTIME) public @interface StopObject < >@Target(value=ElementType.TYPE) @Retention(value= RetentionPolicy.RUNTIME) public @interface ControlledObject

Напишем модуль, проверяющий подходит ли класс для загрузки в наш гипотетический проект или нет.
Сперва определим сам проверяемый класс.

@ControlledObject(name="biscuits") public class Cookies < @StartObject public void createCookie()< //бизнес логика >@StopObject public void stopCookie() < //бизнес логика >>

Для того, чтобы работать с классом, сначала необходимо загрузить класс в контекст приложения. Используем:
Class cl = Class.forName(«org.annotate.test.classes.Cookies»);
Далее, через механизм reflection мы получаем доступ к полям и аннотациям класса.
Проверим наличие аннотированных методов в классе и аннотации на самом классе:

if(!cl.isAnnotationPresent(ControlledObject.class)) < System.err.println("no annotation"); >else < System.out.println("class annotated ; name - " + cl.getAnnotation(ControlledObject.class)); >boolean hasStart=false; boolean hasStop=false; Method[] method = cl.getMethods(); for(Method md: method) < if(md.isAnnotationPresent(StartObject.class)) if(md.isAnnotationPresent(StopObject.class)) if(hasStart && hasStop) > System.out.println("Start annotaton - " + hasStart + "; Stop annotation - " + hasStop ); 

Запустив, на выходе мы получим:
Start annotaton — true; Stop annotation — true.
Если попробовать убрать одну из аннотаций, то вывод сообщит о несоответствии требованиям.

Итог

Надеюсь, мне удалось показать, что аннотации предоставляют широкие возможности для работы с кодом программ, и имеет смысл не только пользоваться стандартными аннотациями языка, но и облегчать себе жизнь, создавая аннотации под свои нужды.

Подробнее ознакомиться с данным механизмом могу порекомендовать в книге «Java 2. Библиотека профессионала, том 2. Тонкости программирования» Кей С. Хорстманна, Гари Корнелла, или на сайте oracle, где так же есть подробные туториалы.

Источник

Spring: @Value aннотация

Основная цель этой статьи — помочь вам понять, как работает аннотация Spring @Value.

@Value является аннотацией Java, которая используется на уровне параметра поля или метода / конструктора и указывает значение по умолчанию для затронутого аргумента. Он обычно используется для ввода значений в конфигурационные переменные — что мы покажем и объясним в следующей части статьи.

Основное назначение

Для самых простых примеров мы назначим значения трем различным полям, используя аннотацию @Value , дав им явные значения:

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

Очень важно отметить, что аргумент, переданный аннотации @Value , может быть только String . Spring преобразует значение в указанный тип, и присвоение будет выполнено без проблем, даже если мы передаем переменным String значение int или boolean .

Spring Environment

Внедрение значений из файлов свойств с помощью аннотации @Value , вероятно, наиболее часто используется в реальных приложениях.

Мы будем использовать файл свойств по умолчанию для Spring Boot — application.properties , где мы можем определить переменные, к которым мы сможем обращаться позже:

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

В этом примере значения переменных считываются из файла application.properties и присваиваются им во время создания компонента.

В большинстве случаев мы использовали бы этот подход для вставки значений конфигурации из файла application.properties в bean-компоненты.

Значение по умолчанию

Значения по умолчанию используются как «запасной вариант», если свойство, которое мы хотим внедрить, не определено или отсутствует:

@Value("$") private String type; 

В приведенном выше примере, потому как мы не имеем никакого значения car.type в application.properties , Spring присвоит Sedan к переменной type в качестве значения по умолчанию.

Если свойство car.type вставляется в файл свойств, вместо него будет использоваться новое значение.

Системные переменные

Мы также можем получить доступ к системным переменным, которые хранятся в виде свойств приложения Spring при запуске:

@Value("$") // Or @Value("$") private String userName; @Value("$") // Or @Value("$") private int numberOfProcessors; @Value("$") private String java; 

Переменные могут вызываться с различными соглашениями об именах — Spring ищет нас и присваивает правильное значение.

Значение глобального метода

Поскольку @Value обрабатывается классом BeanPostProcessor , он будет вызываться, когда Spring создает контекст Spring, создавая экземпляры файлов конфигурации и компонентов.

Это означает, что при наличии метода @Value все аргументы будут сопоставлены со значением, указанным в аннотации:

@Value("$") public CarData setCarData(String color, String brand)

Если мы печатаем, carData.getCarColor() и carData.getCarBrand() мы получим значение car.brand оба раза, потому что, как мы сказали, все аргументы будут сопоставлены с предоставленным значением.

Параметр метода Value

Мы можем исправить это, используя @Value непосредственно с параметр метода:

@Value("$") public CarData setCarData(@Value("$") String color, String brand)

Теперь, если мы печатаем значения из объекта carData — поле цвета будет иметь значение car.color , потому что мы предоставили значение для параметра самого метода.

Spring Expression Language (SpEL)

Язык выражений Spring (SpEL) — это язык выражений, который служит основой для оценки выражений в портфолио Spring.

По сути, когда мы используем SpEL вместе с аннотацией @Value , мы просто меняем способ сказать Spring, что нам нужно. Давайте внимательнее посмотрим:

@Value("#") private String userName; 

Это то, как вы вводите конкретное системное свойство. С другой стороны, мы можем добавить все свойства:

@Value("#") private Map properties; 

Теперь мы знаем, что мы можем использовать аннотацию @Value для методов как глобальное значение или как значение параметра.

Поскольку конструкторы по сути являются методами, мы можем использовать аннотацию и в конструкторах:

public Driver(@Value("#") String name, String location)

Инъекция в Map

С SpEL мы можем сделать некоторые другие довольно интересные вещи в сочетании с аннотацией @Value . Например, давайте сделаем Map, представляет что indoor и outdoor хобби студента. Каждый из них может иметь несколько значений:

Теперь, чтобы ввести это, нам понадобится Map > :

@Value("#>") private Map> hobbies; 

Внедрение в списки

Если свойство имеет значения, разделенные запятыми, например, простой список книг, мы можем использовать SpEL для его интерпретации и преобразования в список:

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

Используя метод split() и разделяя для каждой запятой ( , ), мы можем вставить эти значения в список:

@Value("#'.split(',')>") private List booksRead; 

Вывод

Как только вы заканчиваете работу над реальным приложением, вы понимаете, что конфигурация является важной темой, и если вы используете Spring. Существует большая вероятность того, что вы уже используете или вам придется широко использовать аннотацию @Value .

Понимание этой базовой функциональности очень важно, потому что если вы этого не сделаете, вы можете использовать ее совершенно неправильно.

Источник:

Источник

Оцените статью