Spring源码-BeanFactory类关系层级

在这里插入图片描述
在这里插入图片描述

BeanFactory

访问Spring bean容器的根接口。
这是bean容器的基本客户端视图;例如{@link ListableBeanFactory}和{@link org.springframework.beans.factory.config。ConfigurableBeanFactory}可用于特定目的。
这个接口是由包含许多bean定义的对象实现的,每个bean定义由一个String名称唯一标识。根据bean定义,工厂将返回所包含对象的独立实例(Prototype设计模式)或单个共享实例(Singleton设计模式的高级替代方案,其中实例是工厂范围内的单例)。返回哪种类型的实例取决于bean工厂配置:API是相同的。从Spring 2.0开始,根据具体的应用程序上下文(例如:web环境中的“请求”和“会话”作用域)。
这种方法的要点在于BeanFactory是应用程序组件的中心注册中心,并集中应用程序组件的配置(例如,单个对象不再需要读取属性文件)。请参阅“专家一对一J2EE设计与开发”的第4章和第11章,了解这种方法的好处。

请注意,通常最好依赖依赖注入(“推送”配置)通过setter或构造函数来配置应用程序对象,而不是使用任何形式的“拉”配置,如BeanFactory查找。Spring的依赖注入功能是使用这个BeanFactory接口及其子接口实现的。
请注意,通常最好依赖依赖注入(“推送”配置)通过setter或构造函数来配置应用程序对象,而不是使用任何形式的“拉”配置,如BeanFactory查找。Spring的依赖注入功能是使用这个BeanFactory接口及其子接口实现的。
通常,BeanFactory将加载存储在配置源(如XML文档)中的bean定义,并使用{@code org.springframework。Beans}包来配置bean。但是,实现可以根据需要直接在Java代码中返回它创建的Java对象。对于如何存储定义没有任何限制:LDAP、RDBMS、XML、属性文件等。鼓励实现支持bean之间的引用(依赖注入)。

与{@link ListableBeanFactory}中的方法相反,如果这是{@link HierarchicalBeanFactory},该接口中的所有操作也将检查父工厂。如果在这个工厂实例中没有找到bean,将询问直接的父工厂。这个工厂实例中的bean应该覆盖任何父工厂中同名的bean。

Bean工厂实现应该尽可能地支持标准的Bean生命周期接口。初始化方法的完整集合及其标准顺序为:

  1. BeanNameAware的{@code setBeanName}
  2. BeanClassLoaderAware的{@code setBeanClassLoader}
  3. BeanFactoryAware的{@code setBeanFactory}
  4. EnvironmentAware的{@code setEnvironment}
  5. EmbeddedValueResolverAware的{@code setEmbeddedValueResolver}
  6. ResourceLoaderAware的{@code setResourceLoader}(仅适用于在应用程序上下文中运行时)
  7. ApplicationEventPublisherAware的{@code setApplicationEventPublisher}(仅适用于在应用程序上下文中运行时)
  8. MessageSourceAware的{@code setMessageSource}(仅适用于在应用程序上下文中运行时)
  9. ApplicationContextAware的{@code setApplicationContext}(仅适用于在应用程序上下文中运行时)
  10. ServletContextAware的{@code setServletContext}(仅适用于在web应用程序上下文中运行时)
  11. BeanPostProcessors的
  12. InitializingBean的{@code afterPropertiesSet}
  13. 自定义初始化方法定义
    1. 在关闭bean工厂时,应用以下生命周期方法:

      1. DestructionAwareBeanPostProcessors
      2. {@code postProcessBeforeDestruction}方法
      3. DisposableBean的{@code destroy}
      4. 一个自定义的销毁方法定义

    ListableBeanFactory

    {@link BeanFactory}接口的扩展,由可以枚举所有bean实例的bean工厂实现,而不是像客户端请求的那样逐个按名称进行bean查找。预加载所有bean定义(如基于xml的工厂)的BeanFactory实现可以实现这个接口。

    如果这是一个{@link HierarchicalBeanFactory},返回值将不考虑任何BeanFactory层次结构,而只与当前工厂中定义的bean相关。使用{@link BeanFactoryUtils} helper类也可以考虑祖先工厂中的bean。

    这个接口中的方法将只尊重这个工厂的bean定义。它们将忽略任何通过其他方式(如{@link org.springframework.beans.factory.config)注册的单例bean。除了{@code getBeanNamesForType}和{@code getBeansOfType}之外,ConfigurableBeanFactory}的{@code registerSingleton}方法也会检查这种手动注册的单例。当然,BeanFactory的{@code getBean}也允许对这种特殊bean进行透明访问。然而,在典型的场景中,所有bean都将由外部bean定义定义,因此大多数应用程序不需要担心这种差异。

    注意:除了{@code getBeanDefinitionCount}和{@code containsBeanDefinition}之外,该接口中的方法不是为频繁调用而设计的。实现可能很慢。

    HierarchicalBeanFactory

    由bean工厂实现的子接口,可以是层次结构的一部分。

    对应的{@code setParentBeanFactory}方法可以在ConfigurableBeanFactory接口中找到,该方法允许以可配置的方式设置父节点。

    AutowireCapableBeanFactory

    {@link org.springframework.beans.factory的扩展。接口BeanFactory}将由能够自动装配的bean工厂实现,前提是它们希望为现有bean实例公开此功能。

    BeanFactory的这个子接口不打算在普通的应用程序代码中使用:坚持使用{@link org.springframework.beans.factory。或者{@link org.springframework.beans.factory。ListableBeanFactory}用于典型用例。其他框架的集成代码可以利用这个接口来连接和填充Spring不控制其生命周期的现有bean实例。例如,这对于WebWork Actions和Tapestry Page对象特别有用。

    注意这个接口不是由{link org.springframework.context实现的。ApplicationContext} facade,因为它很少被应用程序代码使用。也就是说,它也可以从应用程序上下文获得,可以通过ApplicationContext的{link org.springframework.context.ApplicationContextgetAutowireCapableBeanFactory()}方法访问。

    你也可以实现{@link org.springframework.beans.factory。接口,即使在ApplicationContext中运行,也会公开内部的BeanFactory,以访问AutowireCapableBeanFactory:只需将传入的BeanFactory转换为AutowireCapableBeanFactory。

    • 7
      点赞
    • 14
      收藏
      觉得还不错? 一键收藏
    • 0
      评论
    评论
    添加红包

    请填写红包祝福语或标题

    红包个数最小为10个

    红包金额最低5元

    当前余额3.43前往充值 >
    需支付:10.00
    成就一亿技术人!
    领取后你会自动成为博主和红包主的粉丝 规则
    hope_wisdom
    发出的红包
    实付
    使用余额支付
    点击重新获取
    扫码支付
    钱包余额 0

    抵扣说明:

    1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
    2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

    余额充值