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) {
...
}