我有一个带有以下切入点定义的Aspect
@Pointcut("execution(public de.company.project..* *(..))")
和包含以下
的弹簧配置<aop:aspectj-autoproxy />
<bean id="myaspect"
class="de.company.project.impl.MyAspect" />
<bean id="someService" class="de.company.project.impl.SomeService" />
<bean name="/SomeService"
class="org.springframework.remoting.caucho.HessianServiceExporter">
<property name="service" ref="someService" />
<property name="serviceInterface"
value="de.company.project.interf.SomeService" />
</bean>
(实际配置中有多个服务)
我看到在某些方法中调用了方面,但并未在所有方法中调用。我怀疑(但还不完全是shure)只有在接口中直接声明的方法被包装在方面中并且在超级接口中声明的方法被忽略(尽管该接口应该匹配相同的切入点)。
这是预期的行为吗?我该怎么改变它?还有什么可能发生?
答案 0 :(得分:2)
答案是:我搞砸了Pointcut模式。看起来像这样
@Pointcut("execution(public de.company.project..* *(..))")
指定返回类型的包,而这个
@Pointcut("execution(public de.company.project..*(..))")
指定具有该方法的类型的包。
答案 1 :(得分:1)
只是一个猜测。我没有得到证据,这可能是您设置的实际原因。
我知道Spring AOP不会拦截本地方法调用。即如果相同的对象调用自己的方法,则应用的代理不拦截调用,即使它与切入点表达式匹配。
编辑:另一个猜测。您确定所有类的实例都是Spring托管代码吗?你的代码的某些部分(或某些库)是否有可能在不使用Spring的情况下创建类的实例? 如果发生这样的事情,Spring AOP不能拦截这样的bean,因为Spring AOP只围绕Spring管理的bean编织。