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

Jive论坛与Spring框架

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

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

相关文章:

  • 2021-07-21
  • 2021-12-12
  • 2022-12-23
  • 2021-08-04
  • 2021-12-13
  • 2021-04-03
  • 2021-06-09
  • 2022-12-23
猜你喜欢
  • 2021-07-23
  • 2021-11-23
  • 2021-11-04
  • 2022-12-23
  • 2022-12-23
  • 2021-06-15
  • 2021-08-22
相关资源
相似解决方案