通过切面为特定类引入新功能
<aop:aspect>
<aop:declare-parents
types-matching="com.luenxin.model.Performer+" 任何类只要实现了 Performer接口(注意结尾的"+")
implement-interface="com.luenxin.annotation.ISpeaker" 那么也相当于实现了 ISpeaker接口,可以调用ISpeaker接口的方法
delegate-ref="speaker" 调用 ISpeaker接口方法的实现 由id=speaker的Bean来调用,该Bean必须已实现了ISpeaker接口
/>
</aop:aspect>
<aop:declare-parents
types-matching="com.luenxin.model.Performer+" 任何类只要实现了 Performer接口(注意结尾的"+")
implement-interface="com.luenxin.annotation.ISpeaker" 那么也相当于实现了 ISpeaker接口,可以调用ISpeaker接口的方法
delegate-ref="speaker" 调用 ISpeaker接口方法的实现 由id=speaker的Bean来调用,该Bean必须已实现了ISpeaker接口
/>
</aop:aspect>
Performer performer = (Performer) applicationContext.getBean("druggler");
( (ISpeaker) performer).speakSomething("说了很多话"); // 把performer强转成 ISpeaker,可调用ISpeaker的方法
( (ISpeaker) performer).speakSomething("说了很多话"); // 把performer强转成 ISpeaker,可调用ISpeaker的方法
public interface ISpeaker {
public void speakSomething(String says);
}
目标是 types-matching的类,spring让它实现 implement-interface所指向的接口, 而具体实现则通过default-impl或default-rel属性来赋予。
所以 让 types-matching 的类添加了 接口并且指定了实现。
所以从spring容器中拿出来的 performer 对象 可以被强转换成 ISpeaker 类型的对象。如果调用ISpeaker的方法必须要强转,因为这些都是spring背后做了很多事情。而不是代码显示地继承了它的接口。