抽象类'受保护方法的Spring切入点

时间:2014-01-08 17:53:50

标签: java spring aspectj spring-aop

我正在使用Spring 3.2AspectJ 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。对于非抽象类中的公共方法,这是有效的。如何使它适用于抽象类中的受保护方法?

2 个答案:

答案 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