mixins and introductions
很多人说道aop,都以为aop就是截取器,切入点表达式,方面和实现(advices)。其实aop
不止这些,另外一个很重要的功能在jboss aop里面就是可以透明的给java类传入接口。你
可以强制一个类实现的接口,甚至你可以附加另外的类(mixins)来实现这个接口。就像c++
里面的多重集成。
引入
首先我们介绍怎么强制现有的类来实现你希望它实现的接口。
首先的例子是让一个非可持久化类实现持久化能力。这对你将是十分有用的代码。
public class pojo
{
private string field;
}
要使它可以持久化很简单。
<introduction class="pojo">
<interfaces>java.io.serializable</interfaces>
</introduction>
上面的xml定义让aop框架知道你要把serializable接口应用到你的类中。在这里你可以自由的
增加任何接口到你的类上,只需要添加interfaces元素就可以了。
如果你的类没有实现接口,aop框架会增加实现的方法给你的类。这些方法会委派给aop框架,但
需要使用截取器或实现来进行维护,否则nullpointerexception会抛出。
mixin it up
引入接口只是限制你,在实现接口时,如果你的类没有实现,就用内部的截取器或实现来实现。这
个地方就是mixin要用的地方了。aop框架允许你定义mixin类来实现你要实现的接口。这个类的实例化
将在你首次调用引入接口的方法的时候。
继续我们使用一个externalizable 类来实现java.io.externalizable 这个接口。
public class pojo
{
private string field;
}
要让他实现externalizable很简单
<introduction class="pojo">
<mixin>
<interfaces>
java.io.externalizable
</interfaces>
<class>externalizablemixin</class>
<construction>new externalizablemixin(this)</construction>
</mixin>
</introduction>
和上面一样这里只要求pojo实现一个接口,你自己可以在这里实现你的很多接口。
这里的class元素定义了实现接口externalizable的mixin类,pojo来实现。
construction 元素允许你使用java代码来定义实例化mixin类的时候你想用的方法。jboss aop
会使用一个字段使实例化的pojo持有你的实现类externalizablemixin的句柄。这个字段会使用
你在construction里提供的代码来进行初始化。上面的this指的就是pojo自身的实例。
最后就是你必须实现mixin类了。
public class externalizablemixin implements java.io.externalizable
{
pojo pojo;
public externalizablemixin(pojo pojo)
{
this.pojo = pojo;
}
public void readexternal(objectinput in) throws ioexception, classnotfoundexception
{
pojo.stuff2 = in.readutf();
}
public void writeexternal(objectoutput out) throws ioexception
{
out.writeutf(pojo.stuff2);
}
}
多重继承 multiple inheritance
需要注意的一点就是mixin使你的java在内部实现了多重集成。虽然在外部你不需要直接
在xml里面映射多重集成或者声明绑定,但实际上它使你实现了多年以来c++所具有的优点。
虽然多数的专家都反对使用多重集成,但如果恰当的使用抽象的mixin类来实现多重集成
在很多地方对你的设计还是很有帮助的。
