首先主要看过两篇博客:分别是:http://www.cnblogs.com/xing901022/p/4265748.html。http://blog.csdn.net/robinjwong/article/details/25568481
然后结合自己的理解写了一篇博客。其中代码是参照第一篇博客的代码。本人新手,如果所有不足的地方,还请大家多多指正。
先上代码:
定义了两个接口:
public interface Add {
public void printWord();
}
public interface Chinese {
public void say();
}
其中Chinese是原始类,Add接口是新添加的方法要实现的接口。
以上两个接口分贝的实现类是:
public class Lilei implements Chinese{
@Override
public void say() {
// TODO Auto-generated method stub
System.out.println("I am Chineses");
}
}
public class Todo implements Add{
@Override
public void printWord() {
// TODO Auto-generated method stub
System.out.println("I love China");
}
}
最关键的部分还是xml配置文件:
<bean id="lilei" class="Interface.Lilei"/>
<bean id="doSomething" class="Interface.Todo"/
<aop:config proxy-target-class="true">
<aop:aspect>
<aop:declare-parents
types-matching="Interface.Lilei"
implement-interface="Implement.Add"
default-impl="Interface.Todo"/>
</aop:aspect>
</aop:config>
其中aop:declare-parents 标签主要实现的功能是(教科书上的说法):声明了此切面所通知的Bean在它的对象层次中拥有的新的父类型。根据我理解是这样的:
相当于Add与Lilei整合为一个新的类型。但是Lilei就可以调用Add的相关方法,虽然Lilei没有真正的实现Add的相关接口。但是在调用的新方法的时候,还是要转化为请求方法的接口类型。
看起一篇博文的时候,发现其测试类存在问题。结合第二篇的博文,修改相关的代码如下:
public static void main(String[]args)
{
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("Bean.xml");
Add chineses=(Add)applicationContext.getBean("lilei");
// 使用aop:declare-parents标签可以从整体看来是lilei实现了 add接口,虽然从底层代码上来说根本没有实现任何的接 //口,这样就相当于lilei类添加了
//一个新的方法。
chineses.printWord();
}
原来的代码是这样的:
Chinese lilei = (Chinese)ctx.getBean("lilei"); lilei.Say(); Add lilei2 = (Add)ctx.getBean("lilei"); lilei2.Todo();如果按照这样的做法,根本就起不到什么作用,还是两个类分开,没有实现真正的整合。