首    页 建模架构 设计模式 培训咨询 jdon框架 论坛

  Jive论坛与Spring框架

板桥里人 http://www.jdon.com 2004/07/01

  没有一种新技术是凭空诞生的,它的萌芽或胚胎总是或多或少显现于以前的技术中,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,但是是否有权限访问呢?如下图:


  
   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管理下的对象的调用。如下图:

 

  以上只是大体解构了Spring的架构,Spring框架在这个架构下,还顺带了很多其它功能,如Web MVC、 DAO JDBC、 DAO ORM 、以及remote,后者类似我设计的EJB方法调用框架。

  总之,Spring确实是Ioc和AOP的完美应用,Ioc用来装载JavaBeans,创建这些对象;AOP用来拦截这些对象的使用,这才是框架设计的必然经典方式。

参考文章:

Spring专题

国人最早开源IOC/AOP框架JdonFramework

AOP权限拦截器在JiveJdon中应用源

从Jive2到JiveJdon3看OO发展轨迹

Spring 和EJB终于统一融合

探讨Spring框架使用真相

Ioc模式(又称DI:Dependency Injection)

IOC模式的思考和疑问

Java企业系统架构选择考量

JBoss 5迎来Java的彻底的可配置时代

Ioc容器的革命性优点

 

 

发表相关讨论

 

更多依赖注射专题

更多AOP专题

更多关于IOC讨论

更多关于AOP讨论

更多关于Spring讨论


更多标签...



Jdon框架演示

JiveJdon
源码下载

VIP收费区

历史热点讨论排行榜




google yahoo 新浪ViVi 365Key网摘 天极网摘 CSDN网摘 添加到百度搜藏 POCO网摘





手机 add to google add to yahoo
联系我们 | 关于我们 | 广告联系 | 网站地图 | 设为首页

沪ICP证08026060 如有意见请与我们联系 Powered by JdonFramework
_×
您有新消息