Как воспроизвести пользовательскую аннотацию плюс АОП?

Java

исходный адрес

предисловие

Аннотация находится в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;
    }

}

После завершения определения перезапустите проект, а затем вызовите интерфейс

Результаты операций можно увидеть уже в силе.

На этом статья заканчивается.