Java - Spring AOP Pointcut не работает

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

Я написал этот код на следующих примерах:

@Aspect
public class MethodLogger {

    private Logger log = Logger.getLogger(getClass().getName());

    @Pointcut("execution(* setHeight(..))")
    public void log(JoinPoint point) {
        log.info(point.getSignature().getName() + " called...");

    }
}

Мой простой тестовый класс:

public class ChairImpl implements Chair {
    int height;
    public ChairImpl(){}

    public int getHeight() {
        return height;
    }
    public void setHeight(int height) {
        this.height = height;
    }


}

Конфигурация My Spring xml:

<?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:p="http://www.springframework.org/schema/p"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd 
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd"
        default-destroy-method="destroy"
        default-init-method="afterPropertiesSet"
        default-autowire="byName"
>

<aop:aspectj-autoproxy>
        <aop:include name="MethodLogger"/>
    </aop:aspectj-autoproxy>

    <bean id="logger1" class="lab.MethodLogger"/>

    <bean id="chair1" 
    class="lab.test.ChairImpl"
    >
        <property name="height" value="10"/>
    </bean>

</beans>

И мой основной метод:

public class Main {
    public static void main(String[] args){
        ApplicationContext context = new ClassPathXmlApplicationContext("spec.xml");
        ((AbstractApplicationContext) context).close();

    }
}

Поэтому перед запуском моего проекта Eclipse выдает мне эту ошибку (она помечается красным void слово для log метод):

Pointcuts without an if() expression should have an empty method body

Когда я запускаю, моя программа запускается без ошибок, потому что выглядит log метод никогда не запускался. Так как я мог это исправить, чтобы он работал и выводил журнал? Я пытался просто напечатать test text из этого метода, но он никогда не делает, так что это означает, что он никогда не работает. Что мне здесь не хватает?

В документации он пишет только расплывчатые примеры:

@Pointcut("execution(* transfer(..))")// the pointcut expression
private void anyOldTransfer() {}// the pointcut signature

Но мне трудно понять, как на самом деле использовать его, чтобы увидеть результаты.

1 ответ

Решение

Вы можете попробовать анонимный pointcut следующим образом:

@Before("execution(* setHeight(..))")
public void log(JoinPoint point) {
    log.info(point.getSignature().getName() + " called...");

}

или дайте вашему pointcut имя и используйте его следующим образом:

@Pointcut("execution(* setHeight(..))")
public void setters() {}

@Before("setters()") 
public void log(JoinPoint point) {
...
}
Другие вопросы по тегам