如何在不修改代码的情况下,为一个类增加一个新的方法呢?
Spring给出的答案是可以,只需要通过AOP,动态地让bean实现接口就可以做到!
最初有一个bean,叫做Coder(码农),他只会敲代码
public class Coder {
public void code(){
System.out.println("撸代码");
}
}
这时候公司要开年会了,码农要学跳舞表演节目,怎么在不修改Coder类代码的情况下实现呢?
首先定义一个接口Dance,并有一个DanceImp实现该接口
public interface Dancer {
public void dance();
}
public class DanceImp implements Dancer{
@Override
public void dance() {
System.out.println("the girl is dangerous");
}
}
Spring的答案就是:aop:declare-parents
<aop:config>
<aop:aspect>
<aop:pointcut expression="(* com.yonyou.ido.Coder.*(..))" id="perform"/>
<aop:declare-parents types-matching="com.yonyou.ido.Coder"
implement-interface="com.yonyou.dance.Dancer"
default-impl="com.yonyou.dance.DanceImp"/>
</aop:aspect>
</aop:config>
types-matching:需要被增强的类为Coder
implement-interface:Coder需要动态实现的接口
default-impl:该接口的实现类
测试代码
在spring容器中注册一个Coder的bean
<bean id="coder" class="com.yonyou.ido.Coder"/>
测试类:
ApplicationContext ctx = new ClassPathXmlApplicationContext("beans.xml");
Dancer dancer = (Dancer) ctx.getBean("coder");
dancer.dance();
代码看上去很简单,注意我们的bean是com.yonyou.ido.Coder类型,但是getBean的返回值强转为了Dancer对象
工程代码:http://download.youkuaiyun.com/detail/yj7758423/9754518