技术库 > Java

Spring 的微内核与FactoryBean扩展机制

技术库:tec.5lulu.com

from:tec.5lulu.com

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呢?就是Beanxml 定义里的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扩展机制  

SpringAOPORM、事务管理、JMXQuartz、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  

Spring 的微内核与FactoryBean扩展机制


标签: 接口 spring pojo本文链接 http://tec.5lulu.com/detail/110dmn2eh7grw853e.html

我来评分 :6.1
0

转载注明:转自5lulu技术库

本站遵循:署名-非商业性使用-禁止演绎 3.0 共享协议

www.5lulu.com