2011-10-11 39 views
1

鉴于my.package下面的示例类...澄清了Spring的AOP切入点和继承

public class Foo { 
    public void logicNotInBar()  {/*code*/} 
    public void logicBarOverrides() {/*code*/} 
} 

public class Bar extends Foo { 
    public void logicBarOverrides() {/*code*/} 
} 

和下面的Spring的AOP切入点...

<aop:pointcut id="myPointcutAll" expression="execution(* my.package.*.*(..))" /> 
<aop:pointcut id="myPointcutFoo" expression="execution(* my.package.Foo.*(..))" /> 
<aop:pointcut id="myPointcutBar" expression="execution(* my.package.Bar.*(..))" /> 

是什么结果建议应用于Bar上的上述切入点?尤其是...

Bar bar = new Bar(); 
bar.logicNotInBar();  // will myPointcutBar advice trigger? 
bar.logicBarOverrides(); // is myPointcutFoo ignored here? 

我觉得我缺少的切入点是如何与继承交互,从而欠引擎盖解释/ DOC可能会很长的路要走一些基本的道理。

+1

没有通知将被应用,因为酒吧是不是一个“代理豆”,你不能手动实例化一个必须被建议的类......它必须被定义为Spring Bean:http://static.springsource.org/spring/docs/3.0.0.M3/spring-framework-reference/html/ch08s06 .html#aop-understanding-aop-proxies – davorp

+0

也是很好的使用接口,并在这些接口上定义切入点,而不是在实现上:http://static.springsource.org/spring/docs/3.0.0.M3/弹簧框架参考/ HTML/ch08.html#AOP-引入的代理 – davorp

回答

2

aspectj documentation

当匹配方法,执行的连接点,如果执行切入点 方法签名指定一个声明类型,切入点将在该类型中声明仅 匹配方法,或方法的是重写方法 在该类型中声明或继承。所以切入点

执行(公共无效中间。*())

挑选出所有的方法执行 公共方法返回void并没有论据是 要么宣布,或者,中东继承,即使这些方法是在Middle的子类中重写的 。所以,切入点就在此代码挑选出Sub.m()的方法 ,执行连接点:

class Super { 
    protected void m() { ... } 
    } 
    class Middle extends Super { 
    } 
    class Sub extends Middle { 
    public void m() { ... } 
    }