Добавление новых аспектов в Spring PetClinic

Мы попытались добавить новый класс аспектов в пакет аспектов в org.springframework.samples.petclinic.

Мой класс аспекта выглядит следующим образом:

package org.springframework.samples.petclinic.aspects;

import org.apache.openjpa.jdbc.sql.Join;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.samples.petclinic.context.SessionContext;

import java.util.Date;

@Aspect
public class MethodLogAspect {

    Logger logger = LoggerFactory.getLogger(MethodLogAspect.class);

    @Pointcut("execution(* org.springframework.samples..*.*(..))")
    public void methodLogging(){}

    @Before("methodLogging()")
    public void logMethodStart(JoinPoint joinPoint){

        String methodName = joinPoint.getSignature().getName();
        String className = joinPoint.getTarget().getClass().getName();
        logger.info("class name: "+className+"invoked method:"+methodName+" at "+ ((new Date()).getTime()));
    }

    @After("methodLogging()")
    public void logMethodEnd(JoinPoint joinPoint){
                String methodName = joinPoint.getSignature().getName();
                String className = joinPoint.getTarget().getClass().getName();
                logger.info("class name: "+className+"finished invoking method:"+methodName+" at "+ ((new Date()).getTime()));
    }

}

Затем я пошел дальше и аспектировал файл aop.xml в /resources/META-INF следующим образом:

<?xml version="1.0"?>

<!-- Custom aspects for the PetClinic sample application -->
<aspectj>

    <weaver>
        <include within="org.springframework.samples.petclinic..*"/>
    </weaver>

    <aspects>
        <aspect name="org.springframework.samples.petclinic.aspects.UsageLogAspect"/>
        <aspect name="org.org.springframework.samples.petclinic.aspects.MethodLogAspect"></aspect>
        <concrete-aspect name="org.springframework.samples.petclinic.aspects.ApplicationTraceAspect"
                extends="org.springframework.samples.petclinic.aspects.AbstractTraceAspect">
            <pointcut name="traced" expression="execution(* org.springframework.samples..*.*(..))"/>
        </concrete-aspect>
    </aspects>

</aspectj>

Когда я создаю войну и развертываю ее, в журнале не появляется ничего из вывода, указанного в моем аспекте. Я не уверен, какой именно шаг мне здесь не хватает. Я также чувствую, что не понимаю механику того, как все связано друг с другом. Может ли кто-нибудь указать, что мне не хватает, и подтолкнуть меня в правильном направлении.

Спасибо

Редактировать:

Мне удалось решить эту проблему, добавив компонент (аспект) в папку applicationContext-jdbc.xml в папке webapp/WEB-INF/spring. Я не уверен, почему это сработает? Может ли кто-нибудь дать мне объяснение? -Спасибо


person sc_ray    schedule 09.12.2011    source источник
comment
Вы уверены в конфигурации ведения журнала? Вы можете использовать подачку, чтобы исключить это. Работают ли другие аспекты - для интеграции с аспектом вам нужно запустить его с аргументом командной строки javaagent   -  person gkamal    schedule 09.12.2011
comment
@gkamal - Спасибо. Ага. Для конфигурации ведения журнала в log4j.properties установлено значение INFO. Похоже, что другие аспекты работают. Что такое СОП?   -  person sc_ray    schedule 09.12.2011


Ответы (1)


Я не уверен в конфигурациях плетения Aspectj, но в Spring AOP вы можете использовать

<aop:aspectj-autoproxy/> 

чтобы включить автоопределение аннотаций @Aspect . Прочитайте http://static.springsource.org/spring/docs/3.0.x/spring-framework-reference/html/aop.html#aop-ataspectj для получения дополнительной информации.

person Aravind A    schedule 09.12.2011