предисловие
Аннотация находится вJDK1.5
Новые функции, представленные позже, расположены по адресу java.lang.annotation
, Annotation — это фактически специальная разметка кода, эти метки можно прочитать во время компиляции, загрузки классов и во время выполнения, и выполнить соответствующую обработку. Эта статья в основном анализирует, как настраивать аннотации и некоторые базовые знания об аннотациях, а затем сотрудничает с этимAOP
Играйте в новые трюки в практических приложениях.
Эта статья разделена на три части
- Анализ аннотаций
- пользовательская аннотация
- аннотации времени компиляции
- аннотации времени выполнения
- Интегрировать АОП
Его можно разделить на две статьи, но я хочу подумать об этом. Возьми горячее железо.
Анализ аннотаций
Как работают аннотации
Если вы хотите настроить аннотации, вам нужно знать, как они составлены, и объединить аннотации, обычно используемые в проекте, чтобы проанализировать, как они работают.
посмотри@Override
Аннотация. Его основная функция — выполнять проверку формата во время компиляции. нажмите, чтобы посмотреть@Override
выполнить.
Нажмите и найдите, что он пуст и ничего, кроме двух мета-аннотаций, так как это реализуется?
фактически@Override
Его можно понимать как метку, он не имеет фактической логической обработки, а пользователь аннотации — это тот, кто реализует логику. По сути, это «помеченная аннотация», известная только компилятору.
Например, ваш начальник просит вас разобрать важные документы, а документов слишком много.Вам обязательно нужно отметить важные документы.Когда вы передадите его своему начальнику, что сделает начальник? Начальник, конечно же, видит помеченный документ и идет его проверять.
Используйте с приведенным выше примером@Override
Вы тот, кто аннотирует, а ваш начальник — виртуальная машина JVM.При компиляции ваш начальник проверяет, а JVM находит аннотацию (метку) и обрабатывает ее.Механизм обработки — в основном внутренняя обработка JVM.
Подвести итог:
Определение аннотаций, сканирование аннотаций, выполнение логики
метааннотация
Перед настройкой аннотаций нам нужно знать несколько "мета-аннотаций", предоставляемых JDK для нас. Мета-аннотации — это аннотации, которые определяют аннотации. Давайте посмотрим, что они делают.
Всего существует четыре мета-аннотации, все из которых можно найти в java.lang.annotation
найдено под
- @Target
- @Retention
- @Documented
- @Inherited
@Target
@Target
Аннотации в основном используются для определения того, где используются аннотации и где могут использоваться описанные аннотации.@Target
Параметр представляет собой класс перечисления ElementType, который подробно описан ниже.
перечисление 😀 |
роль 😊 |
---|---|
ElementType.PACKAGE | Аннотации используются в пакетах |
ElementType.TYPE | Аннотации действуют на типы (классы, интерфейсы, аннотации, перечисления) |
ElementType.ANNOTATION_TYPE | Аннотации действуют на аннотации |
ElementType.CONSTRUCTOR | Аннотации действуют на конструкторы |
ElementType.METHOD | Аннотации применяются к методам |
ElementType.PARAMETER | Примечания для действия по параметрам |
ElementType.FIELD | Аннотации действуют на свойства |
ElementType.LOCAL_VARIABLE | Аннотации действуют на локальные переменные |
@Target
Если область действия не задана, она может быть применена ко всем целям по умолчанию.
посмотри@Target
исходный код
Посмотрите, есть параметр Value, его возвращаемое значение равноElementType[]
, ElementType — это перечисляемый выше класс.
@Retention
Роль аннотации @Retention заключается в указании жизненного цикла аннотации. Например, его можно обрабатывать во время компиляции, а можно во время выполнения. Его класс перечисленияRetentionPolicy
перечисление 😀 |
роль 😊 |
---|---|
RetentionPolicy.SOURCE | Сохраняется в исходном коде, может быть обработан во время компиляции |
RetentionPolicy.CLASS | Он зарезервирован в файле класса и может быть обработан при загрузке класса. |
RetentionPolicy.RUNTIME | Сохраняется во время выполнения, может быть обработан во время выполнения |
@Retention
Значение по умолчаниюRetentionPolicy.CLASS
то есть обрабатывается, когда класс загружается
@Retention
исходный код
@Documented
Аннотация @Documented относительно проста, и ее основная функция — описание документации аннотации. То есть при создании javadoc он не содержит аннотаций, но если аннотация изменена @Documented, сгенерированный документ содержит аннотацию. Эта аннотация может быть удалена в будущих версиях, я не буду подробно читать ее здесь.
@Inherited
Аннотация, измененная аннотацией @Inherited, является наследуемой, то есть, если мы декорируем класс @Inherited, то подкласс этого класса также унаследует эту аннотацию по умолчанию.
исходный код
пользовательская аннотация
Метааннотации аннотаций представлены выше, так что давайте начнем пользовательские аннотации на практике.
Адрес проекта GIT: https://github.com/scramblecode/project-demos.
Как обычно, сначала создайте проект Выше приведен пример этой статьи, которую можно скачать и просмотреть.
Сначала напишите простой пример. Затем используйте пользовательские аннотации и перехватчики в SpringBoot, чтобы получить параметры запроса.
Аннотация простого определения
Вот два примера: один — аннотация времени компиляции, а второй — аннотация времени выполнения. Наконец, очень практичный пример написания проекта с помощью SpringBoot+AOP.
аннотации времени компиляции
Создание аннотаций во время компиляции Сначала нам нужно создать проект зависимостей в качестве обработчика аннотаций.
Сначала создайте интерфейс аннотации, вы можете создать аннотации, используя IDEA для создания.
созданиеDataTest
Аннотация, цель определения аннотации здесь - распечатать во время компиляции, если аннотация используется.Hello World!
.
Затем напишите обработчик аннотаций, используемый здесьAbstractProcessor
, Эта статья предназначена только для простого использования, если у вас есть возможность написать статью для изученияAbstractProcessor
.
Конкретный код
Затем нужно создать файл META-INF, здесь рекомендуется использовать гугловский auto-service
может быть автоматически сгенерирован META-INF/services/javax.annotation.processing.Processor
.
Просто добавьте зависимости
<dependency>
<groupId>com.google.auto.service</groupId>
<artifactId>auto-service</artifactId>
<version>1.0-rc5</version>
</dependency>
После его определения введите процессор аннотаций в свой основной проект. Добавьте зависимость локального процессора аннотаций в файл POM.
После завершения добавления создайте простой класс, а затем добавьте@DataTest
аннотация
Бег начала компиляции вы найдете следующую информационную консольную вывод.
Аннотации времени компиляции могут создавать некоторые инструменты генерации, такие как ломбок, которые можно использовать для генерации кода.
аннотации времени выполнения
Просто создайте аннотацию, чтобы получить имя и путь к пакету, указанные в аннотации.
Сначала создайте аннотации, которые определены как аннотации времени выполнения, нацеленные на атрибуты класса и т. д.
использовать аннотации
@GetClassName(value = "测试注解")
public class Student {
}
Затем создайте класс обработки аннотаций и запустите
Вывод консоли.
Интегрировать АОП
В веб-разработке часто необходимо выводить логи, а тут еще время выполнения интерфейса. Теперь мы используем пользовательские аннотации и АОП для достижения этой функции.
Во-первых, улучшить проект и добавить тестовый интерфейс
Затем создайте аннотацию журнала.
Затем определите класс аспекта
@Aspect
@Component
@Slf4j
public class LoggerAspect {
private static final Logger logger = LoggerFactory.getLogger(LoggerAspect.class);
@Pointcut("@annotation(com.lqcoder.annotationdemo.annotation.OutputLog)")
public void weblog(){
}
@Around("weblog()")
public Object around(ProceedingJoinPoint point) throws Throwable {
long beginTime = System.currentTimeMillis();
ServletRequestAttributes attributes = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
HttpServletRequest request = attributes.getRequest();
List<Object> logArgs = Arrays.stream(point.getArgs())
.filter(arg -> (!(arg instanceof HttpServletRequest) && !(arg instanceof HttpServletResponse)))
.collect(Collectors.toList());
try {
logger.info("请求url={}, 请求参数={}", request.getRequestURI(), JSON.toJSONString(logArgs));
} catch (Exception e) {
logger.error("请求参数获取异常", e);
}
Object result = point.proceed();
//执行时长(毫秒)
long time = System.currentTimeMillis() - beginTime;
try {
logger.info("请求耗时={}ms, 返回结果={}", time, JSON.toJSONString(result));
} catch (Exception e) {
logger.error("返回参数获取异常", e);
}
return result;
}
}
После завершения определения перезапустите проект, а затем вызовите интерфейс
Результаты операций можно увидеть уже в силе.
На этом статья заканчивается.