Pointcut не работает с Spring AOP - PullRequest
       19

Pointcut не работает с Spring AOP

4 голосов
/ 18 января 2009

Чтобы реализовать ведение журнала с помощью Spring AOP, я выполнил следующие простые шаги. Но похоже, что это не работает. Любая помощь будет полезна

1) Создан MyLoggingAspect класс

    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) Создан класс ( TixServiceImpl ), в который я хочу войти

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) Создан spring-aspectj.xml файл

<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) Создан простой тестовый клиент ( 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) Это дает мне следующее Вывод

...
Instantiated MyLoggingAspect
did some calculation..
End of the the client invocation!!

Ответы [ 2 ]

15 голосов
/ 18 января 2009

Я просто проверяю ваш код, но у меня есть догадка, проблема в том, что вы не получаете свой экземпляр TixServiceImpl из Spring, а скорее вручную создаете его экземпляр в своем TixClient. Я думаю, что ваш TixService должен быть bean-компонентом Spring, полученным из Spring ApplicationContext, чтобы у Spring была возможность настроить аспекты возвращаемого экземпляра.

2 голосов
/ 19 января 2009

Скотт Бэйл прав: пусть весна установит для вас TixServiceImpl. Также в подобных случаях включение ведения журнала Springs может помочь, поскольку оно сообщает, сколько целей было найдено для аспекта / устройства.

...