0

For spring boot application.

I have my aspect listen on my private or public method inside my scheduled method.

But it doesn't work. However, the aspect can listen on my scheduled method.

Here is an example on my github.

https://github.com/benweizhu/spring-boot-aspect-scheduled

Does any know the answer or why? or how to resolve it?

Thanks

Ben
  • 687
  • 7
  • 15

1 Answers1

2

Aspects will not work on calling other methods within the same class as it cannot be proxied.

It means that self-invocation is not going to result in the advice associated with a method invocation getting a chance to execute.

Okay, so what is to be done about this? The best approach (the term best is used loosely here) is to refactor your code such that the self-invocation does not happen

note on proxying private methods :

Due to the proxy-based nature of Spring’s AOP framework, protected methods are by definition not intercepted, neither for JDK proxies (where this isn’t applicable) nor for CGLIB proxies (where this is technically possible but not recommendable for AOP purposes). As a consequence, any given pointcut will be matched against public methods only!

If your interception needs include protected/private methods or even constructors, consider the use of Spring-driven native AspectJ weaving instead of Spring’s proxy-based AOP framework. This constitutes a different mode of AOP usage with different characteristics, so be sure to make yourself familiar with weaving first before making a decision.

refer : How can I log private methods via Spring AOP?

change the code as below:

@Component
public  class Test{

    public void reportInPrivateMethod() {
        System.out.println("private method");
       
    }

    public void reportInPublicMethod() {
        System.out.println("public method");
       
    }
}

Now invoke this method :

@Component
public class ScheduledTasks {

    @Autowired
    private Test test;

    private static final Logger log = LoggerFactory.getLogger(ScheduledTasks.class);

    private static final SimpleDateFormat dateFormat = new SimpleDateFormat("HH:mm:ss");

    @Scheduled(fixedRate = 5000)
    public void reportCurrentTime() {
        test.reportInPrivateMethod();
        test.reportInPublicMethod();
        log.info("The time is now {}", dateFormat.format(new Date()));
    }


}

Modify the aspects as per the changes :

@Aspect
@Component
public class Monitor {

   @AfterReturning("execution(* com.zeph.aop.ScheduledTasks.reportCurrentTime())")
public void logServiceAccess(JoinPoint joinPoint) {
    System.out.println("Completed: " + joinPoint);
}

@AfterReturning("execution(* com.zeph.aop.Test.reportInPrivateMethod())")
public void logServiceAccessPrivateMethod() {
    System.out.println("Completed  PRIVATE :");
}

@AfterReturning("execution(* com.zeph.aop.Test.reportInPublicMethod())")
public void logServiceAccessPublicMethod() {
    System.out.println("Completed PUBLIC: ");
}
}
Community
  • 1
  • 1
Barath
  • 5,093
  • 1
  • 17
  • 42