没有一种新技术是凭空诞生的,它的萌芽或胚胎总是或多或少显现于以前的技术中,jive论坛是大家潜心研究的设计型应用程序,其相关解析可见本栏的gof设计模式专栏。
jive和spring同为由javabeans组成的j2ee web系统,jive作为早期成功设计案例,其主要架构成为大多数纯javabeans系统的流行架构,spring也不例外。
spring框架除了是一种web层应用框架,还提供了访问ejb层的接口,也有jdbc/orm的直接操作。spring框架主要魅力是使用ioc模式和aop实现了jive系统的通用功能,从而使得jive这样的纯javabeans架构设计可以重用在其它系统中。
如果你感慨于jive的设计理念,但是又苦于无法重用其设计时,spring框架已经帮你实现了。
同时也要注意到:spring框架类似“杂烩”,它包含了很多j2ee应用的工具,类如对ejb的调用,它的mvc与struts jsf也是相竞争的,以纯ioc和aop设计来说,spring框架也是一种很重的(heavy、weight)框架。spring框架是复杂的,如果想以spring替代ejb,那么无疑按了葫芦浮起瓢。
将jive论坛和spring框架联系起来,会帮助更多理解设计模式的程序员迅速掌握最新的设计思潮,而不是一种跳跃式的强迫接受。如果你对jive有很好的研究,将会发现spring框架是jive设计的更加通用的提升。
在jive中,forumfactory是整个系统的入口和突破点,jive通过forumfactory将整个系统掌控在一个工厂模式下,这样做的好处是:便于控制系统的javabeans,例如,客户端通过forumfactory可创建一个forum或访问一个forum,但是是否有权限访问呢?如下图:
<center>
</center>jive通过forumfactory将这种访问引导到相应的proxy类去,如forumfactoryproxy类等,通过代理模式对这些类进行权限控制访问。这是代理模式的一个主要用处,但是研读jive的代理模式会发现,要为每个类实现一个proxy类,非常琐碎,有没有更优雅的方式呢? 当然使用动态代理。
spring框架基本是抽象上述设计,spring框架对所有javabeans的管理也是基于一个总入口bean factory机制,不同的是,beanfactory可以 管理所有应用的javabeans,使用者只要将自己的javabeans通过配置文件告诉beanfactory,那么beanfactory将会加载这些javabeans,例如:
<beans>
<bean id="examplebean" class="eg.examplebean"/>
<bean id="anotherexample" class="eg.examplebeantwo"/>
</beans>
在jive中,forumfactory加载jive自己的javabeans是通过工厂实现dbforumfactory实现的,如下代码,dbforumfactory引发了后台一系列功能实现,这是纵向,而return new forumfactoryproxy这个语句则类似引来一个切面,从一个横向方面实现了权限访问等功能:
private static string classname = "com.jivesoftware.forum.database.dbforumfactory";
public static forumfactory getinstance(authorization authorization) {
//if no valid authorization passed in, return null.
if (authorization == null) {
return null;
}
//以下使用了singleton 单态模式
if (factory == null) {
synchronized(initlock) {
if (factory == null) {
......
try {
//动态转载类
class c = class.forname(classname);
factory = (forumfactory)c.newinstance();
}
catch (exception e) {
return null;
}
}
}
}
//now, 返回 proxy.用来限制授权对forum的访问
return new forumfactoryproxy(authorization, factory, factory.getpermissions(authorization));
}
既然spring框架也是通过一个bean factory加载所有的类,那么它是如何加载的?通过ioc模式,也就是依赖性注射模式。在我以前文章“ioc模式”中,我比较了factory工厂模式创建对象和ioc模式的注射对象实现之间的异同,ioc相比工厂模式则更加解耦了调用者和被调用者之间关系,使用ioc模式,无需在调用者代码中涉及被调用者的具体实现。
spring框架不但可以向自己容器中注射应用者自己定义的javabeans(也就是创建它们),而且也可以向这些javabeans通过set方法实现数据赋值。
一旦bean factory运行时刻掌管这些激活的对象,spring通过aop方式,从一个横切面为这些javabeans提供了权限访问、事务锁等通用功能的实现,这种实现是基于动态代理模式,而动态代理是aop实现的一种方式。
前面提到,jive中使用代理模式实现权限访问,比代理模式更加简洁和抽象的是动态代理,使用动态代理将使得调用者无需指定被调用者的代理类,这是动态代理区别代理模式的本质。
动态代理这一优势,又可以体现在另外一句话语上:动态代理拦截了调用者对被调用者的调用,正是这一功能符合了aop的拦截器功能,为aop实现提供了可能。
spring框架使用了动态代理实现的aop,正是通过动态代理机制拦截了外界对bean factory管理下的对象的调用。如下图:
<center>
</center>以上只是大体解构了spring的架构,spring框架在这个架构下,还顺带了很多其它功能,如web mvc、 dao jdbc、 dao orm 、以及remote,后者类似我设计的ejb方法调用框架。
总之,spring确实是ioc和aop的完美应用,ioc用来装载javabeans,创建这些对象;aop用来拦截这些对象的使用,这才是框架设计的必然经典方式。
闽公网安备 35060202000074号