Вокруг аннотации весной - PullRequest
0 голосов
/ 05 февраля 2020

У меня есть следующие программы. Вызывается метод round, но почему не основной метод? Насколько я знаю, метод выполняется до или после выполнения метода. Здесь вокруг вызова метода, но почему он не печатает основной метод, т. Е. GetEmploy ();.

@Configuration
public class App extends Thread{

    public static void main(String[] args) {

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
        context.scan("com.inno.aop");
        context.refresh();
        EmployManager emp = (EmployManager) context.getBean("employManager");
        emp.getEmploy();
        context.close();
    }

}


@Service
public class EmployManager {

    public void getEmploy() {
        System.out.println("Here is your employ" );
    }
    public void getEmp() {
        System.out.println("Here is your emp" );
    }
}


@Aspect
@Component
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class EmployAspect {

     @Around("execution(* com.inno.aop.EmployManager.*(..))")
     public void logAround(JoinPoint joinPoint) {
         System.out.println("Around method getting called");
    }

}



Output:

Around method getting called

Ответы [ 3 ]

1 голос
/ 05 февраля 2020

Из документации

Советы вокруг: совет, который окружает точку соединения, такой как вызов метода. Это самый мощный совет. Вокруг совета может выполнять пользовательское поведение до и после вызова метода. Он также отвечает за выбор перехода к точке соединения или для ускорения выполнения рекомендованного метода путем возврата собственного возвращаемого значения или выдачи исключения.

Нам нужно использовать ProceedingJoinPoint с @ Around advice

org.aspectj.lang.ProceedingJoinPoint

Around извещение объявляется с помощью аннотации @Around. Первый параметр метода совета должен иметь тип ProceedingJoinPoint. В теле рекомендации вызов метода continue () для ProceedingJoinPoint вызывает выполнение базового метода. Метод continue также может передавать Object []. Значения в массиве используются в качестве аргументов для выполнения метода при его выполнении.

Код должен быть

 @Around("execution(* com.inno.aop.EmployManager.*(..))")
 public void logAround(ProceedingJoinPoint joinPoint) throws Throwable {
     System.out.println("Around method getting called");
     joinPoint.proceed();
 }
0 голосов
/ 05 февраля 2020

В методе, аннотированном @Around, нужно вызвать joinPoint.proceed(), тогда будет вызван только перехваченный метод. Кроме того,

  1. не забудьте извлечь аргументы метода и передать их в joinPoint.proceed(Object[] args).
  2. Возвращает объект, возвращенный joinPoint.proceed, из вашего метода logAround (), если перехваченный метод не является пустым.
@Aspect
@Component
@EnableAspectJAutoProxy(proxyTargetClass = true)
public class EmployAspect {

    @Around("execution(* com.inno.aop.EmployManager.*(..))")
    public void logAround(JoinPoint joinPoint) {
        System.out.println("Around method getting called");
        joinPoint.proceed();
    }
}
0 голосов
/ 05 февраля 2020

Вокруг аспект перехватывает вызов, и вы можете решить, следует ли перейти к реальному классу или нет. В этом фрагменте кода вы просто вызываете System.out.println и не запускаете метод реального класса ...

Вы должны вызвать:

@Around(...)
public void logAround(JoinPoint joinPoint) {
   jointPoint.proceed();  // + handle exceptions if required
}
...