我有以下程序。周围的方法被调用,但为什么不是主要方法?据我所知,方法是在方法执行之前或之后执行的。这里围绕方法被调用,但为什么它不打印主要方法,即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

最佳答案

documentation


  围绕建议:围绕连接点的建议,例如方法
  调用。这是最有力的建议。围绕建议
  可以在方法调用之前和之后执行自定义行为。它
  还负责选择是否继续进行连接点
  或通过返回自己建议的方法来捷径建议的方法执行
  返回值或引发异常。


我们需要在@Around建议中使用ProceedingJoinPoint

org.aspectj.lang.ProceedingJoinPoint


  通过使用@Around批注来声明周围建议。首先
  建议方法的参数必须为ProceedingJoinPoint类型。
  在建议的正文中,在
  ProceedingJoinPoint使基础方法执行。的
  前进方法也可以传入Object []。数组中的值
  用作方法执行时的参数。


该代码应为

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

关于java - Spring 标注,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/60069978/

10-12 01:18