当前位置: 首页 > news >正文

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,但是是否有权限访问呢?如下图:

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

2004090105.jpg

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

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

转载于:https://www.cnblogs.com/laoxingxuzhou/archive/2004/11/20/5172990.html

相关文章:

  • 实现支持文件分块多点异步上传的 Web Services 及其客户端(非Web)应用程序调用相关异步执行的 Web Method...
  • delphi提示错误行号之Assert(断言)
  • 转贴一篇友情提示
  • CDH5.3配置Kerberos+LDAP+Sentry记录
  • 未来通信构想 LifeWorks无缝通信
  • 漫谈开发设计中的一些“原则”及“设计哲学”
  • mysql5.7 多级主从+multisource
  • 庄子与我的名字
  • 数据结构基础 - 链表的遍历 zz
  • 代码片段添加智能提示,打造一款人见人爱的ORM框架
  • [导入]常用Response对象的使用详解
  • 模板的特化
  • My favorite books
  • JVM(一)——JMM
  • 使用eval元素
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • Android框架之Volley
  • CentOS 7 修改主机名
  • dva中组件的懒加载
  • JSONP原理
  • laravel 用artisan创建自己的模板
  • MySQL主从复制读写分离及奇怪的问题
  • oschina
  • Vue--数据传输
  • 从0搭建SpringBoot的HelloWorld -- Java版本
  • 服务器之间,相同帐号,实现免密钥登录
  • 名企6年Java程序员的工作总结,写给在迷茫中的你!
  • 前端工程化(Gulp、Webpack)-webpack
  • 前端技术周刊 2018-12-10:前端自动化测试
  • 巧用 TypeScript (一)
  • 世界编程语言排行榜2008年06月(ActionScript 挺进20强)
  • 我从编程教室毕业
  • 我有几个粽子,和一个故事
  • 译有关态射的一切
  • 鱼骨图 - 如何绘制?
  • 原生Ajax
  • 正则表达式
  • MPAndroidChart 教程:Y轴 YAxis
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • #pragma 指令
  • #我与Java虚拟机的故事#连载19:等我技术变强了,我会去看你的 ​
  • (06)Hive——正则表达式
  • (超简单)使用vuepress搭建自己的博客并部署到github pages上
  • (附源码)ssm考试题库管理系统 毕业设计 069043
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • (转)JAVA中的堆栈
  • (转)Oracle存储过程编写经验和优化措施
  • ***汇编语言 实验16 编写包含多个功能子程序的中断例程
  • .360、.halo勒索病毒的最新威胁:如何恢复您的数据?
  • .equal()和==的区别 怎样判断字符串为空问题: Illegal invoke-super to void nio.file.AccessDeniedException
  • .NET 回调、接口回调、 委托
  • .net 使用ajax控件后如何调用前端脚本
  • .NET8.0 AOT 经验分享 FreeSql/FreeRedis/FreeScheduler 均已通过测试
  • .NetCore项目nginx发布