我正在使用Spring 3.2
和AspectJ 1.7.1
。 (我不太可能在不久的将来升级到更高版本。)
我需要为抽象类中的受保护方法定义切入点。 AFAIK我需要AspectJ
用于非公开的方法,所以我只用(AspectJ
)注释尝试了这个:
package com.aspects;
@Aspect
public class Aspect{
@Before("execution(* com.x.y.x.MyClass.myMethod(..))")
public void beforeAspect(){
//do something here
}
}
在beans.xml
我有:
<aop:aspectj-autoproxy />
<bean id="myAspect" class="com.aspects.Aspect"/>
我已经检查过,我的Aspect
类被创建(构造函数被调用),启动应用程序时不会抛出任何异常。
但是我无法调用beforeAspect
。对于非抽象类中的公共方法,这是有效的。如何使它适用于抽象类中的受保护方法?
答案 0 :(得分:6)
您应该在抽象类之后添加+
符号。
所以
"execution(* com.x.y.x.MyClass.myMethod(..))"
应该是这样的:
"execution(* com.x.y.x.MyClass+.myMethod(..))"
↑
+
是关于继承要么扩展给定的类(MyClass
)还是实现接口。
答案 1 :(得分:2)
实际上你正在使用@ AspectJ-style来配置Spring AOP。 <aop:aspectj-autoproxy>
声明AnnotationAwareAspectJAutoProxyCreator
BeanPostProcessor
,但您需要运行aspectj编译器。
有关使用Spring编织方面的更多信息,请参阅参考文档中的9.8 Using AspectJ with Spring applications。
有关使用maven配置编译时编织的详细信息,请参阅Spring / @Transactional with AspectJ is totally ignored。