Spring AOP - Pointcuts не срабатывает - PullRequest
2 голосов
/ 28 июля 2010

Я только начинаю работу со Spring AOP в моем проекте и у меня возникают некоторые проблемы с правильной работой Spring AOP.

У меня есть два объекта, TransportImpl и SesssionImpl, которые я хотел бы профилировать через AOP. Оба объекта (бины) инициализируются через Spring. Оба бина являются реализациями бизнеса интерфейсы (транспорт и сессия). Я могу заставить Аспекты, примененные к bean-компоненту TransportImpl, работать хорошо, но те, которые применяются к SessionImpl, просто не запускаются. Я могу подтвердить, что Аспект «mySessionMonitor» инициализируется Spring, и что объект SessionImpl также инициализируется без каких-либо исключений или ошибок.

Я сократил свои PointCuts и Aspect до максимально возможной формы. Я ожидал бы PointCut sessionOperation , описанный ниже срабатывать, когда инициализируется компонент SessionImpl и вызывается метод инициализации init. Но этого никогда не происходит. Что может быть не так?

Из файла конфигурации:

<bean id="MyTransport" class="my.app.transport.TransportImpl"   scope="singleton" />                
<bean id="MySession" class="my.app.session.SessionImpl" init-method="initialise" scope="singleton" />

<aop:aspectj-autoproxy proxy-target-class="true">
    <aop:include name="myTransportMonitor" />
    <aop:include name="mySessionMonitor" />
</aop:aspectj-autoproxy>

<bean id="myTransportMonitor" class="my.app.aspects.TransportMonitoringAspect"/>
<bean id="mySessionMonitor"   class="my.app.aspects.SessionMonitoringAspect" />

Аспект код

// Aspect monitoring code
@Aspect
public class SessionMonitoringAspect
{
    private Logger fileLogger = Logger.getLogger("myLogger");

    public void initialise()
    {
        fileLogger.info("Initialising SessionMonitoringAspect");
    }

    @Pointcut ("execution (public * *(..))")
    private void anyPublicOperation(){}

    @Pointcut ("within(my.app.session..*)")
    private void inSession(){}

    @Pointcut("anyPublicOperation() && inSession()")
    private void sessionOperation(){}

    @Before("sessionOperation()")
    public void sessionOperationDetected(JoinPoint jp)
    {
        fileLogger.info("Session operation detected - signature: " + jp.getSignature());
    }
}

Ответы [ 3 ]

3 голосов
/ 12 августа 2010

Лично я предпочитаю указывать конфигурацию точки Aspect в контексте приложения, а вы упускаете ссылку в aop: aspect.

 <bean id="mySessionMonitor"   class="my.app.aspects.SessionMonitoringAspect" />

 <aop:config proxy-target-class="true">
  <aop:aspect ref="mySessionMonitor">
   <aop:pointcut id="around" expression="execution (public * *(..))"/></aop:pointcut>
   <aop:around pointcut-ref="around" method="aroundAdvice"/>
  </aop:aspect>
 </aop:config>
0 голосов
/ 20 августа 2010

Если вы предпочитаете конфигурацию на основе аннотаций, см. этот пример , который я написал. Все, что вам нужно в вашей конфигурации XML, это <aop:aspectj-autoproxy />.

0 голосов
/ 05 августа 2010

Надеюсь, initialise() метод не является частью my.app.session.SessionImpl. Если так, то initialise() метод вашего Аспекта не сработает. Потому что вы не можете вызвать метод аспекта из класса бина. В противном случае, пожалуйста, приложите my.app.session.SessionImpl код для детального понимания.

...