服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

jive论坛与spring框架的经典结合


  没有一种新技术是凭空诞生的,它的萌芽或胚胎总是或多或少显现于以前的技术中,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> jive论坛与spring框架的经典结合(图一)</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> jive论坛与spring框架的经典结合(图二)</center>
  以上只是大体解构了spring的架构,spring框架在这个架构下,还顺带了很多其它功能,如web mvc、 dao jdbc、 dao orm 、以及remote,后者类似我设计的ejb方法调用框架。
  
  总之,spring确实是ioc和aop的完美应用,ioc用来装载javabeans,创建这些对象;aop用来拦截这些对象的使用,这才是框架设计的必然经典方式。

扫描关注微信公众号