views:

2136

answers:

2

In order to implement Logging using Spring AOP I followed these simple steps. But it seems like its not working. Any help would be useful

1) Created MyLoggingAspect class

    import org.aspectj.lang.ProceedingJoinPoint;

public class MyLoggingAspect
{

    public MyLoggingAspect() {
     super();
     System.out.println("Instantiated MyLoggingAspect");  
    }

    public Object log(ProceedingJoinPoint call) throws Throwable
    {
        System.out.println("from logging aspect: entering method [" + call.toShortString()
                            +"] with param:"+call.getArgs()[0] );

        Object point =  call.proceed();

        System.out.println("from logging aspect: exiting method [" + call.toShortString()   
                            + "with return as:" +point);        

        return point;
    }

}

2) Created a class (TixServiceImpl) where I want logging

public class TixServiceImpl implements TixService{

    @Override
    public void calculateSomething() {
     String s = "did some calculation..";
     System.out.println(s);
    }

    @Override
    public String getTixName() {
     return null;
    }
}

3) Created a spring-aspectj.xml file

<beans...    
    <bean id="LoggingAspect"  class = "MyLoggingAspect"/>
    <aop:config>
          <aop:aspect ref="LoggingAspect">
             <aop:pointcut id="myCutLogging"
                    expression="execution(* TixService*.*(..))"/>
             <aop:around pointcut-ref="myCutLogging" method="log"/>
          </aop:aspect>
    </aop:config>    
</beans>

4) Created a simple test client (TixClient)

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.FileSystemXmlApplicationContext;

public class TixClient {

    public static void main(String[] a){

     ApplicationContext context = new FileSystemXmlApplicationContext("conf/spring-aspectj.xml");

     TixService tix = new TixServiceImpl();
     tix.calculateSomething();
     String s = tix.getTixName();

     System.out.println("End of the the client invocation!!"); 
    } 
}

5) It gives me the following Output

..

Instantiated MyLoggingAspect

did some calculation..

End of the the client invocation!!

+7  A: 

I'm just inspecting your code, but I have a hunch the problem is that you're not getting your TixServiceImpl instance from Spring, but rather you're manually instantiating it yourself in your TixClient. I'm thinking your TixService needs to be a Spring bean, gotten from the Spring ApplicationContext, so that Spring has a chance to set up the aspects on the returned instance.

Scott Bale
Thanks for the tip, it worked. It would be good if this was mentioned in the samples/examples/tutorials available online.
a-sak
Glad to have helped
Scott Bale
+1  A: 

Scott Bale is right: Let spring instatiate the TixServiceImpl for you. Also in cases like this, enabling Springs logging might help because it tells you how many targets for a aspect/avice were found.

tobsen