Spring源码解析-BeanFactory

508 阅读2分钟

BeanFactory 是访问 Spring bean 容器的根接口,此接口由包含许多Bean定义的对象实现,工厂将返回包含对象的独立实例(原型设计模式),或单个共享实例(单例设计模式的高级替代方案,其中实例是工厂范围内的单例)。返回哪种类型的实例取决于 bean factory 配置(scope):API 是相同的(既调用方法)。 从 Spring 2.0 开始,根据具体的应用程序上下文(例如 Web 环境中的“请求”和“会话”范围),可以使用更多范围。注意一般依赖依赖注入更好(“推送”配置)通过设置器配置应用程序对象或构造函数,而不是使用任何形式的“拉”配置,如BeanFactory 查找。 Spring 的依赖注入功能是使用此BeanFactory接口及其子接口实现。通常 BeanFactory 将加载存储在配置中的 bean 定义源(例如 XML 文档),并使用 {@code org.springframework.beans}包来配置bean。 然而,一个实现可以简单地返回它根据需要直接在 Java 代码中创建 Java 对象。 没有定义存储方式的限制:LDAP、RDBMS、XML、属性文件等。鼓励实现支持引用在 bean 中(依赖注入)。与 {@linkListableBeanFactory} 中的方法相比,所有的此接口中的操作还将检查父工厂,如果这是一个{@link HierarchicalBeanFactory}。 如果在这个工厂实例中没有找到 bean,将询问直接的母厂。 此工厂实例中的 Bean应该覆盖任何父工厂中的同名 bean。

Bean 工厂实现应尽可能支持标准的 Bean 生命周期接口。全套初始化方法及其标准顺序是:

  • BeanNameAware的{@code setBeanName}
  • BeanClassLoaderAware 的 {@code setBeanClassLoader}
  • BeanFactoryAware 的 {@code setBeanFactory}
  • ResourceLoaderAware 的 {@code setResourceLoader}(仅适用于在应用程序上下文中运行)
  • ApplicationEventPublisherAware的{@code setApplicationEventPublisher}(仅适用于在应用程序上下文中运行)
  • MessageSourceAware 的 {@code setMessageSource}(仅适用于在应用程序上下文中运行时)
  • ApplicationContextAware 的 {@code setApplicationContext}(仅适用于在应用程序上下文中运行时)
  • ServletContextAware 的 {@code setServletContext}(仅适用于在 Web 应用程序上下文中运行时)
  • BeanPostProcessors 的 {@code postProcessBeforeInitialization} 方法
  • InitializingBean 的 {@code afterPropertiesSet}
  • 自定义初始化方法定义
  • BeanPostProcessors的{@code postProcessAfterInitialization}方法

在关闭 bean 工厂时,以下生命周期方法适用:

  • DisposableBean 的 {@code destroy}
  • 自定义销毁方法定义

BeanDefinition接口:BeanDefinition 描述了一个 bean 实例,它具有属性值,构造函数参数值,以及由具体实施。