花钱的年华

--今天开始成为主站

用户操作
[即时聊天] [发私信] [加为好友]
肖桦ID:calvinxiu
689656次访问,排名53好友0人,关注者36
calvinxiu的文章
原创 161 篇
翻译 0 篇
转载 0 篇
评论 646 篇
江南白衣的公告

肖桦,江南白衣,
开源项目SpringSide
春天的旁边
发起者

最近评论
calvinxiu:
发版本最痛苦的事情,就是刚发完之后忽然又有了一个比较重要的更新。

推荐大家下载3.0.3.1 (2mb)

1.简化了目录结构,感觉又清爽了不少。
2.消除了最后一块需要逐个Class写配置文件的地方(applicationContext.xml中的sessionFactory的mapping class)。
dreaming:恭喜~
hongyi:还是一头雾水,郁闷,为啥有这么多东东,叫人头大
suncheng_hong:用过appfuse,但springside还没有尝试过。
suncheng_hong:很想尝试一下。
文章分类
    收藏
      相册
      Blog用图
      Friends
      @_@
      Anders小明
      buaawhl
      cac
      canonical
      cctvx1
      david.turing
      femto
      g9
      JohnsonQu
      Michael Chen
      Raimundox
      robbin
      SimonLei
      totodo
      wuyu
      周爱民
      孟岩
      差沙
      庄表伟
      落魄的程序员
      透明
      郁也风
      铁手
      银狐999
      飞云小侠
      存档
      软件项目交易
      订阅我的博客
      XML聚合  FeedSky
      订阅到鲜果
      订阅到Google
      订阅到抓虾
      订阅到BlogLines
      订阅到Yahoo
      订阅到GouGou
      订阅到飞鸽
      订阅到Rojo
      订阅到newsgator
      订阅到netvibes

      原创 Spring 的微内核与FactoryBean扩展机制收藏

      新一篇: 扩展Spring系列(2) ---Spring对各种数据访问框架的集成机制 | 旧一篇: Groovy MOP实现mini-language 如传说中Java7.0的XML嵌入式语法

      作者:江南白衣 

                扩展Spring系列(1)--Spring 的微内核与FactoryBean扩展机制

      DreamHead在《思考微内核》十分激赏 Spring的微内核与扩展机制:
      “Spring的微内核在哪里呢?便是DI容器。而通过FactoryBean,我们可以定制自己的组件组装过程,对一个普通的JavaBean做手脚,像Spring AOP中常用的ProxyFactoryBean做的那样。如此,我们就不必把所有功能都做到Spring的DI容器中去,而是以一个FactoryBean来对DI容器的功能进行扩展。除了Spring自身之外,现在已经有一些项目开始利用这个特性扩展Spring,比如,Acegi Security和Spring Modules。”

       这确是框架容器界应该贯彻的范式,微内核提供最少的功能,而由扩展接口去增强框架的能力。下面看看Spring怎么设计,明白之后就可以开始为Spring捐献精力了:)

      1、微内核的功能
      1.1 DI(依赖注入)与Singleton管理
            利用POJO setter的DI机制,估计每位同学随手都能写一个简单版本,不多说了。
            Singleton管理说白了就是先到一个map中按id找找看有没有已存在的实例。

      1.2 BeanName与BeanFactory注入
            除了DI注入的属性,微内核还有什么能卖给POJO呢?就是Bean在xml 定义里的id和BeanFactory自己了。
            卖的机制是让POJO 实现 BeanNameAware和BeanFactoryAware接口。BeanFactory用 if(pojo instance of BeanFactoryAware)判断到POJO需要注入BeanFactory,就调用setBeanFactory(this)将自己注入。

            这种框架中基于接口的注入和调用机制在Java下挺标准的,Spring的功能多是基于这种模式提供。遗憾就是Java不支持多重继承,作为替代的接口里不能提供默认的实现,导致每一个Pojo都要很无聊的实现一遍setBeanFactory()。

      1.3 DI后的初始化函数调用
            比如属性A,B注入之后,需要同时根据A和B来对A,B进行加工或者装配一个内部属性C,这样就需要在所有属性注入后再跑一个init()函数。
            Spring提供两种方式,一种是和上面的原理一样,实现InitializingBean接口的afterPropertiesSet()函数供Spring调用。
            一种是在xml定义文件里面自行定义init函数名。
            懒得每次在xml文件里定义的就采用第1种方式,不想与spring耦合的pojo就采用第2种方式。本来就是为了扩展Spring而存在的FactoryBean多采用第一种。

         所谓微内核,就是仅提供以上三种功能的DI容器。
         但作为轻量级容器,还需要以下两种方式,向容器内的POJO 附加各种服务。


      2.FactoryBean扩展机制
      Spring的AOP、ORM、事务管理、JMX、Quartz、Remoting、Freemarker、Velocity,都靠FacotryBean的扩展,FacotryBean几乎遍布地上:
      <bean id="sessionFactory"
      class
      ="org.springframework.orm.hibernate3.LocalSessionFactoryBean"/>

      <bean id="baseDAOService"
      class
      ="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"/>

      只不过当年对这类factoryBean比较麻木不仁,不问原理的照搬照用了。

      不过这原理说出来也好简单,所有FactoryBean 实现FactoryBean接口的getObject()函数。Spring容器getBean(id)时见到bean的定义是普通class时,就会构造该class的实例来获得bean,而如果发现是FacotryBean接口的实例时,就通过调用它的getObject()函数来获得bean,仅此而以.......可见,很重要的思想,可以用很简单的设计来实现。

      考察一个典型的FactoryBean:
          一般会有两个变量,三个接口:
          一个setter函数注入需要改装的pojo,一个内部变量保持装配后的对象returnOjbect。
          implements三个接口 :FactoryBean,InitializingBean和BeanFactoryAware 。
          各接口的意义之前都讲过了。factoryBean会在afterPropertiesSet()里把pojo改装成returnObject,需要用到beanfactory进行天马行空的动作时就靠BeanFactoryAware注入。最后在getObject()里把returnObject返回。

      Rod说:IoC principles, combined with the factory bean, afford a powerful means to abstract the act of obtaining or accessing services and resources

      3. Bean Post-Processor扩展机制
           如果说FactoryBean 是一种Factory、Wrapper式的扩展,Bean Post-Processor就是另一种AOP、visitor式的机制,所以也多用于spring的AOP架构。
            Post-Processor的原理就是BeanFactory在前文里的调用afterPropertiesSet()/init-method前后,调用在工厂里注册了的post-processor的postProcessBeforeInitialization()和postProcessAfterInitialization()。
            那怎么注册登记呢?又分请不请礼仪公司两类。如果是ApplicationContext,你把继承BeanPostProcessor 的bean往xml里一搁就行了,application context自会打理。如果是BeanFacotry,就要显式的注册,代码大概像:
           
      XmlBeanFactory factory = new XmlBeanFactory("C:/beans.xml"); 
      BeanPostLogger logger 
      = new BeanPostLogger(); 
      factory.addBeanPostProcessor(logger);


      Rod说:"Post-processors add the ability to customize bean and container behavior in a flexible, externalized fashion. "
      对比Factory Bean那段,可见两种机制在他心目中的不同作用。

      系列文章:
      Spring 的微内核与FactoryBean扩展机制
      扩展Spring(2)--Spring对各种数据访问框架的集成机制

      发表于 @ 2005年08月25日 17:07:00|评论(loading...)|编辑

      新一篇: 扩展Spring系列(2) ---Spring对各种数据访问框架的集成机制 | 旧一篇: Groovy MOP实现mini-language 如传说中Java7.0的XML嵌入式语法

      评论

      #庄表伟 发表于2005-08-26 14:32:00  IP: 211.100.4.*
      哈哈!你被贴了

      http://spaces.msn.com/members/zbw25/Blog/cns!1pA6-3FOo9yNp_4lmEHxdDqA!406.entry
      发表评论  


      登录
      Csdn Blog version 3.1a
      Copyright © 江南白衣