`
江南白衣
  • 浏览: 550847 次
  • 来自: 广州
社区版块
存档分类
最新评论

Spring 的微内核与FactoryBean扩展机制

阅读更多
作者:江南白衣 

          扩展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对各种数据访问框架的集成机制

 

分享到:
评论

相关推荐

    简单了解Spring中BeanFactory与FactoryBean的区别

    简单了解Spring中BeanFactory与FactoryBean的区别 Spring框架中有两个非常关键的接口:BeanFactory和FactoryBean。虽然它们的名字相似,但它们的作用和实现机制却有很大的不同。 BeanFactory是Spring IoC容器的...

    spring源码解析之FactoryBean相关测试代码demo

    `FactoryBean`是Spring提供的一种扩展点,它是一个工厂,可以用来创建对象。但不同于传统的Java Bean,`FactoryBean`创建的对象在Spring容器中会被当作单独的Bean处理,即使它们可能共享相同的实例。Spring容器会...

    spring的FactoryBean增强我们的目标对象.rar

    `FactoryBean`是Spring中用于对象创建的一种高级机制,它是一个返回特定类型对象的工厂。当我们声明一个bean为`FactoryBean`类型时,Spring容器在实例化bean时会调用`FactoryBean`的相关方法来获取实际的对象,而...

    Spring中的FactoryBean.rar

    在Spring框架中,FactoryBean是一个非常重要的概念,它允许我们自定义对象的创建方式,提供了扩展Spring IoC容器的能力。FactoryBean是Spring提供的一种特殊类型的bean,它不仅仅是一个普通的对象,还是一个工厂,...

    Spring中BeanFactory与FactoryBean接口的区别详解

    在Spring框架中,BeanFactory和FactoryBean是两个重要的接口,它们各自扮演着不同的角色,但都与Spring容器的管理和创建对象密切相关。 **BeanFactory接口**是Spring容器的基础,它是整个Spring IoC(Inversion of ...

    详解Spring中的FactoryBean

    总结来说,Spring的`FactoryBean`提供了一种强大的机制,允许我们在运行时动态地创建和配置Bean,尤其适用于处理复杂逻辑和多步骤的实例化过程。通过自定义`FactoryBean`,我们可以完全控制Bean的生命周期,使得...

    spring中的FactoryBean代码示例

    Spring中的FactoryBean代码示例 在Spring框架中,FactoryBean是一种特殊的Bean,它可以生成其他Bean的实例。今天我们来了解一下FactoryBean的实现和使用。 首先,让我们从SessionFactory说起。在使用SSH集成开发时...

    FactoryBean代码最简实现

    `FactoryBean`是Spring框架提供的一种扩展点,它允许我们自定义对象的创建逻辑,而不仅仅是简单的通过`new`关键字来实例化对象。当Spring容器遇到一个实现了`FactoryBean`接口的bean时,它不会直接调用`getBean()`...

    spring中FactoryBean中的getObject()方法实例解析

    Spring 框架中 FactoryBean 是一个非常重要的概念,它提供了一种创建和管理 Bean 的机制。在 Spring 中,FactoryBean 是一个特殊的 Bean,它可以创建其他 Bean,並提供了对这些 Bean 的管理。今天,我们将深入探讨 ...

    深入了解Spring中的FactoryBean

    FactoryBean可以用来创建和管理复杂的对象实例,并且可以与其他Spring组件集成,例如BeanFactory和ApplicationContext。 六、结论 FactoryBean是一个非常重要的概念,在Spring框架中扮演着核心角色。它提供了一种...

    spring中的BeanFactory与FactoryBean的讲解

    Spring中的BeanFactory与FactoryBean的讲解 在Spring框架中,BeanFactory和FactoryBean都是非常重要的概念,它们都是Spring IoC容器的组成部分。今天,我们将深入探讨这两个概念的讲解。 一、BeanFactory ...

    68-BeanFactory与FactoryBean1

    Spring 中的 BeanFactory 和 FactoryBean BeanFactory 是 Spring 框架中的核心组件之一,负责管理 Bean 的生命周期,包括实例化、配置和注入对象之间的关系。它是 Spring IOC(控制反转)容器的核心组件,提供了...

    spring如何通过FactoryBean配置Bean

    Spring 通过 FactoryBean 配置 Bean 在 Spring 框架中,FactoryBean 是一种特殊的 Bean,它可以实现复杂的 Bean 实例化逻辑。通过 FactoryBean,我们可以将复杂的实例化逻辑封装起来,使得 Bean 的配置更加灵活和...

    Spring BeanFactory和FactoryBean区别解析

    Spring BeanFactory和FactoryBean的区别解析 Spring框架中,BeanFactory和FactoryBean是两个非常重要的概念,它们都是Spring IoC容器的核心组件。今天,我们将深入探讨这两个概念之间的区别和联系。 首先,让我们...

    spring6pdf详细讲解

    Spring 框架的核心是控制反转(IoC)和依赖注入(DI)模式,它们使得应用程序更加灵活、可维护和可扩展。 在 Spring 中, Bean 是应用程序的核心组件,它们可以是任何 Java 对象。 Spring 提供了多种方式来实例化...

    SSH笔记-通过实现FactoryBean接口来创建 Bean

    在Spring框架中,`FactoryBean`接口是一个非常重要的组件,它允许我们自定义Bean的创建逻辑,这在处理复杂对象的实例化或者需要特定初始化步骤时尤其有用。本笔记将详细探讨如何通过实现`FactoryBean`接口来创建Bean...

    37. Spring Boot集成EHCache实现缓存机制【从零开始学Spring Boot】

    在本教程中,我们将深入探讨如何使用Spring Boot集成EHCache来实现高效的缓存机制。Spring Boot简化了配置过程,使得我们可以快速地将EHCache引入到我们的应用中,从而提高应用程序的性能,减少对数据库或其他资源的...

    FactoryBean.zip

    总的来说,`FactoryBean`是Spring框架中一个强大的工具,它扩展了Spring容器的能力,使得我们可以自定义对象的创建方式,更好地满足了复杂应用的需求。通过"FactoryBean.zip"中的示例,我们可以深入学习这一特性,...

    初探spring aop内部实现 java

    在实际开发中,理解Spring AOP的内部机制有助于我们更好地利用其功能,提高代码的可维护性和扩展性。而DataSource的灵活配置和FactoryBean模式则可以帮助我们实现更高效、可扩展的数据访问层。通过阅读和分析源代码...

    SpringQuartz的使用文档

    Spring提供了`FactoryBean`类,如`SchedulerFactoryBean`,用于创建和管理Quartz的`Scheduler`实例。这使得我们可以利用Spring的依赖注入(DI)和管理上下文来创建和控制Quartz的相关组件,如`Trigger`和`JobDetail`...

Global site tag (gtag.js) - Google Analytics