Как я могу использовать аннотацию @around spring aop при объявлении метода? - PullRequest
0 голосов
/ 28 мая 2019

Как я могу использовать аннотацию @around spring AOP при объявлении метода?на самом деле в java-классе много повторяющегося кода, поэтому я думаю оптимизировать его. Только значения выполнения @around меняются каждый раз, а определение метода одинаково для 3-4 методов. Можете ли вы предложить, что я могу сделать вэто случай для оптимизации кода? Здесь в данном примере вы можете видеть, что nicdStatus и nicdPortStatus только изменяются, а остальные все определения метода одинаковы.Пожалуйста, предоставьте некоторые предложения по оптимизации кода, потому что в моем классе Java есть повторяющийся код.

@Around("execution(* dcp.casa.services.nicd.NicdController.**nicdStatus**(..)) && args(*, relationId,..)")
Object handleRunTest(final ProceedingJoinPoint joinPoint, final String relationId) {
    log.info("xyz");
    callAbc();
    return joinPoint.proceed();
}

@Around("execution(* dcp.casa.services.nicd.NicdController.nicdPortStatus(..)) && args(*, relationId,..)")
Object handleRunTest(final ProceedingJoinPoint joinPoint, final String relationId) {
    log.info("xyz");
    callAbc();
    return joinPoint.proceed();
}

Ответы [ 2 ]

0 голосов
/ 29 мая 2019

Ваш вопрос немного неясен.Правильно ли я понимаю, что у вас есть несколько @Around методов советов с одинаковыми телами методов, и вы хотите выделить эти тела методов во вспомогательный метод, чтобы избежать дублирования кода в ваших аспектах?

да, вы правы @kriegaex.ты понял мой вопрос.

Ну, тогда ответ прост: просто выполните рефакторинг, как если бы вы реорганизовали любой другой класс Java:

package de.scrum_master.aspect;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

@Aspect
public class LoggingAspect {
  private static final Logger log = LoggerFactory.getLogger(LoggingAspect.class);

  private void callAbc() {}

  @Around("execution(* dcp.casa.services.nicd.NicdController.**nicdStatus**(..)) && args(*, relationId, ..)")
  public Object handleRunTestA(ProceedingJoinPoint joinPoint, String relationId) throws Throwable {
    return handleRunHelper(joinPoint);
  }

  @Around("execution(* dcp.casa.services.nicd.NicdController.nicdPortStatus(..)) && args(*, relationId, ..)")
  public Object handleRunTestB(ProceedingJoinPoint joinPoint, String relationId) throws Throwable {
    return handleRunHelper(joinPoint);
  }

  private Object handleRunHelper(ProceedingJoinPoint joinPoint) throws Throwable {
    log.info("xyz");
    callAbc();
    return joinPoint.proceed();
  }
}

Если вспомогательному методу также требуется доступ к String relationId, простодобавьте к нему еще один параметр и соответственно вызовите его.

0 голосов
/ 28 мая 2019

АОП означает, что вы хотите перехватить некоторую логику. Пока вы используете @around, вы можете использовать некоторую логику до и после вашего метода. Это хороший способ удалить дублирующийся код.

Что нужно сделать:

1) найти все методы с дублированным кодом.

2) абстрагировать этот дублированный код в некоторые методы.

3) Конфигурация с правой точкой.

здесь есть еще пример. Надежда может помочь.

...