Spring AOP Capturing of logs inside a method

牧云@^-^@ 提交于 2019-12-11 14:05:39

问题


I'm newbie to Spring AOP. I do understand the concept behind it and i also do understand the concept of @Before or @After etc usage. What i am so confused is still the usage of Spring AOP. Think of the below method of a class.

public void test(int x) {
       :
       x++;
       logger.info("This is a test" + x);
       :
       try {
                   :
       } catch (Exception e) {
           throw new ...
       }
       :
}

The old way of capturing the log is as shown above. Here's my questions:

  1. If i were to implement the above method using Spring AOP, this logger will be removed but then does Spring AOP able to capture this log message? (from what i know Spring AOP does not look inside a method)

  2. If answer to clause 1) is yes then how is it done?

  3. If answer is no what's the point of using Spring AOP. Usage of @Before is useless unless you want to capture the information like parameters prior to execution of the method. Most of the time we want to capture some log inside a method itself.

Forget about AspectJ. I do know that AspectJ can do the above job. I just want to know what's the point of using Spring AOP if it cannot do the very fundamental thing of capturing logs inside a method.

Any help is appreciated.


Further note:

I assume after implementating Spring AOP the above code would be like this. The logger call is no longer in the test method since it will be taken care of by the aspect class. Isn't that the purpose of AOP? To remove cross cutting concern from objects (since it's not related to the actual service of the object) and be taken care of by the aspect class?

public void test() {

       :
       try {
                   :
       } catch (Exception e) {
           throw new ...
       }
       :
}

If Spring AOP cannot do this what's the point of having a AOP?


回答1:


I am having difficulty understanding what you are asking for here. In general, I don't know what it means to 'capture logs inside a method', but I think I can provide some assistance anyways.

It sounds to me like you want to arbitrarily insert code into random points in a method, not necessarily at the beginning or the end of the method. In general, Spring AOP cannot do this, and I am not sure that AspectJ will be able to help with either, but I am less familiar with that to give you a definitive answer.

Spring AOP, like you said, can inject before/after/around various JoinPoints in your codebase. These JoinPoints are going to be methods, and only in Spring managed classes.

So if you have a method like the following, you can add logging (via System.out in this case) around it via an @Around aspect.

The code:

public void test() {
    System.out.println("I am in a method now");
}

The aspect:

@Around("execution(public * *(..))")
public void publicMethods(ProceedingJoinPoint pjp) {
    System.out.println("before in an aspect");
    pjp.proceed();
    System.out.println("after in an aspect");
}

This essentially turns the initial method into this (as well as adding these System.out's to all public methods):

public void test() {
    System.out.println("before in an aspect");
    System.out.println("I am in a method now");
    System.out.println("after in an aspect");
}

Depending on the layout of your code, you may be able to effectively insert arbitrarily by creating methods at the points that you want to insert. I wouldn't recommend this, but it certainly is possible.

Finally, here are the answers to your questions:

  1. You could replace the logger with a @Before aspect, assuming the logging line is the first code in the method. If you were to do that, you would then be able to remove the logging from within the method. I don't quite know what you are asking for with the last sentence, but no, Spring AOP does not look 'inside' a method.
  2. Spring AOP is able to 'capture' it because Spring will proxy the class.
  3. The point of Spring AOP is to be able to 'intercept' method calls. You may not see a real use for it, but it is extremely useful. I would beg to differ on the last sentence, when using Spring AOP, I want to be able to examine what is going into my method, or what is coming out.

EDIT:

You are correct, the log call can be removed, and taken care of by the aspect. The thing that must be noted is that the only opportunities for the log method to be called by the aspect are either before or after the actual method invocation.




回答2:


I think this is helpful for your problem related to AOP-

Spring Framework- Simple Aspect Oriented Programming Example

Spring Framework- Example to Use Pointcuts in AOP



来源:https://stackoverflow.com/questions/15465608/spring-aop-capturing-of-logs-inside-a-method

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!