在JAXWS2.0发布以前,用JAVA发布一个WebService是一件相当复杂的工作,令很多开发高手都望而却步;但随着JAXWS2.0、2.1版本的发布,通过大量使用JAVA annotation特性,以及运用JAXB20规范来统一数据展示,从而大大简化和规范了开发过程,一些新的开源框架也随之诞生。Apache CXF就是其中的佼佼者。它实现了JCP与Web Service2.1中一些重要标准。CXF简化了构造,集成,面向服务架构(SOA)业务组件与技术的灵活复用。在CXF中,Service使用WSDL标准定义并能够使用各种不同的消息格式(或binding)和网络协议(transports)包括SOAP、XML(通过HTTP或JMS)进行访问。
而OSGI技术更是JAVA社区近来的热点,它将面向contract,插件化,组件化的设计思想上升到一个理论的高度,推出了一系列的规范和参考实现;Spring DM更是在OSGI基础上将Spring的DI能力扩充到OSGI层面,并对OSGI规范中缺少的部分加以补充和完善,使之成为更具有实践应用价值的框架。
这篇文件将介绍如何运用这两个开源项目来实现WebService的组件化发布。
环境:
Eclipse3.4
JDK1.605
CXF2.1.1
Spring DM1.0.3
第一步:在Eclipse下创建新的工作区;
第二步:导入Spring DM的Bundle,主要导入以下几个Bundle:
(1)org.springframework.bundle.osgi.core
(2)org.springframework.bundle.osgi.extender
(3)org.springframework.bundle.osgi.io
(4)org.springframework.bundle.spring.aop
(5)org.springframework.bundle.spring.beans
(6)org.springframework.bundle.spring.context
(7)org.springframework.bundle.spring.core
(8)org.springframework.osgi.aopalliance.osgi
第三步:导入其他Eclipse下的Bundle
(1)org.apache.commons.logging
(2)org.eclipse.equinox.http.jetty
(3)org.eclipse.equinox.http.servlet
(4)org.eclipse.osgi.services
(5)org.mortbay.jetty
设计的原则:
(1) CXF将被独立封装成一个Bundle;
(2) CXF Bundle对外提供OSGI服务,其他Bundle可以利用这个服务来发布Web Service;
(3) CXF内部缺省使用了Spring的库,而Spring DM环境也带了Spring 的库,所以在实现CXF Bundle的时候要使CXF运行于None Spring模式;
(4) 充分考虑系统的封装型和可扩展能力;
(5) Web Service必须是动态发布;
GOF:运用共享技术有效地支持大量细粒度的对象。
解释一下概念:也就是说在一个系统中如果有多个相同的对象,那么只共享一份就可以了,不必每个都去实例化一个对象。比如说(这里引用GOF书中的例子)一个文本系统,每个字母定一个对象,那么大小写字母一共就是52个,那么就要定义52个对象。如果有一个1M的文本,那么字母是何其的多,如果每个字母都定义一个对象那么内存早就爆了。那么如果要是每个字母都共享一个对象,那么就大大节约了资源。
在Flyweight模式中,由于要产生各种各样的对象,所以在Flyweight(享元)模式中常出现Factory模式。Flyweight的内部状态是用来共享的,Flyweight factory负责维护一个对象存储池(Flyweight Pool)来存放内部状态的对象。Flyweight模式是一个提高程序效率和性能的模式,会大大加快程序的运行速度。应用场合很多,下面举个例子:
先定义一个抽象的Flyweight类:
public abstract class Flyweight
{
public abstract void operation();
}
在实现一个具体类:
public class ConcreteFlyweight extends Flyweight
{
private String string;
public ConcreteFlyweight(String str)
{
string = str;
}
public void operation()
{
System.out.println("Concrete---Flyweight : " + string);
}
}
实现一个工厂方法类:
public class FlyweightFactory
{
private Hashtable flyweights = new Hashtable();
public FlyweightFactory(){}
public Flyweight getFlyWeight(Object obj)
{
Flyweight flyweight = (Flyweight) flyweights.get(obj)
if(flyweight == null) ...{
//产生新的ConcreteFlyweight
flyweight = new ConcreteFlyweight((String)obj);
flyweights.put(obj, flyweight);
}
return flyweight;
}
public int getFlyweightSize()
{
return flyweights.size();
}
}
最后看看Flyweight的调用:
public class FlyweightPattern {
FlyweightFactory factory = new FlyweightFactory();
Flyweight fly1;
Flyweight fly2;
Flyweight fly3;
Flyweight fly4;
Flyweight fly5;
Flyweight fly6;
/** *//** Creates a new instance of FlyweightPattern */
public FlyweightPattern() {
fly1 = factory.getFlyWeight("Google");
fly2 = factory.getFlyWeight("Qutr");
fly3 = factory.getFlyWeight("Google");
fly4 = factory.getFlyWeight("Google");
fly5 = factory.getFlyWeight("Google");
fly6 = factory.getFlyWeight("Google");
}
public void showFlyweight()
{
fly1.operation();
fly2.operation();
fly3.operation();
fly4.operation();
fly5.operation();
fly6.operation();
int objSize = factory.getFlyweightSize();
System.out.println("objSize = " + objSize);
}
public static void main(String[] args)
{
System.out.println("The FlyWeight Pattern!");
FlyweightPattern fp = new FlyweightPattern();
fp.showFlyweight();
}
}
下面是运行结果:
Concrete---Flyweight : Google
Concrete---Flyweight : Qutr
Concrete---Flyweight : Google
Concrete---Flyweight : Google
Concrete---Flyweight : Google
Concrete---Flyweight : Google
objSize = 2
我们定义了6个对象,其中有5个是相同的,按照Flyweight模式的定义“Google”应该共享一个对象,在实际的对象数中我们可以看出实际的对象却是只有2个






